首页 > 其他分享 >2024/2/18

2024/2/18

时间:2024-02-18 23:56:10浏览次数:34  
标签:int 18 cin scc 2024 ++ low mp

先来强化一下强连通分量

luogu P1407 [国家集训队] 稳定婚姻

题意:

给n对现在的夫妻和m对曾经相爱的人。

如果有一对夫妻分开了,有没有可能这两个人和另外的几对夫妻组成新的组合。

如果可能输出‘unsafe’,否则输出‘safe’

思路:

看完题之后我懵了,我看了一眼题解描述的题意才明白这个题是什么意思。

“我们尝试着将所有的丈夫和妻子用线段连接起来,表示他们之间存在着联系,如果这时有一个女孩和其中的丈夫交往过,那么他们之间也存在着这种联系,所以这两种情况我们可以认为本质是相同的。
那么我们将所有 现在或曾经交往过的 男孩和女孩连接起来,可以发现出现了一些环,而处在环中的几对夫妻都可以更换伴侣,也就是题目中所说的婚姻不安全。那么我们找出这些环,判断哪些夫妻处在环中即可。”

看了这段话恍然大悟,其实就是找环,跟强连通分量一联系,才发现,tarjan算法的实质就是有向图找环

对于这个题来说还要变形一下,因为夫妻和曾经的恋人本来就是两个元素的小环,那么一定有环,

又看了一眼博主的题解,真的妙。

image-20240218212416208

这样既能避免原有的环,又能找到新的环。

#include <bits/stdc++.h>
using namespace std;
	
const int N = 1e5 + 5;

vector<int>e[N];
int dfn[N], low[N], tot;
int stk[N], instk[N], top;	// 栈的作用是记录正在访问的点
int scc[N], siz[N], cnt;	//最后的结果是scc[i] = k 记录第i个节点在第k个强连通分量里,大小是siz【k】
bool Safe[N];

void tarjan(int x) {
	//入x时, 盖戳, 入栈
	dfn[x] = low[x] = ++tot;
	stk[++top] = x, instk[x] = 1;
	for (int y : e[x]) {
		if(!dfn[y]) {		//若y尚未访问
			tarjan(y);
			low[x] = min(low[x], low[y]);		//回x时更新low
		}
		else if(instk[y]) { //若y已访问且在栈中
			low[x] = min(low[x], low[y]);
		}
		// 剩下已经访问并且不在栈中的情况是y已经被访问完,不在枚举
	}
	//离x时,记录scc
	if(dfn[x] == low[x]) { //若x是scc的根
		int y; ++cnt;
		vector<int>vt;
		// vt.push_back(x);
		do{		//陆续把强连通分量出栈
			y = stk[top--]; instk[y] = 0;
			scc[y] = cnt; //scc编号
			vt.push_back(y);
			++siz[cnt];   //scc大小
		} while(y != x);
		if(vt.size() != 1) {
			for (auto it : vt) {
				Safe[it] = 1;
			}
		}
	}
} 

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int n, m;
	cin >> n;

	map<string, int>mp;
	int id = 1;
	for (int i = 0; i < n; i++) {
		string s, t;
		cin >> s >> t;
		mp[s] = id++;
		mp[t] = id++;
		e[mp[s]].push_back(mp[t]);
	}

	cin >> m;
	for (int i = 0; i < m; i++) {
		string s, t;
		cin >> s >> t;
		e[mp[t]].push_back(mp[s]);
	}

	for (int i = 1; i <= n * 2; i++) {
		if(!dfn[i]) {
			tarjan(i);
		}
	}
	
	for (int i = 1; i <= n * 2; i += 2) {
		if(Safe[i]) {
			cout << "Unsafe\n";
		}
		else {
			cout << "Safe\n";
		}
	}
	return 0;
}

标签:int,18,cin,scc,2024,++,low,mp
From: https://www.cnblogs.com/yyc4591/p/18020178

相关文章

  • 2024.2.18 捶打我天然的沉默 切割我卑微与困惑
    今天是DS选讲,理解了大部分内容,还有一些自己口胡了,很好。ARC打的有点难受,因为电脑有点稀碎(指编译1min+),机房的电脑又用不习惯。具体表现为会E差一点过,可惜。CF713CSonyaandProblemWihtoutaLegendslopetrick入门题。具体的,写出DP会发现只需要支持取前缀min,加入......
  • 2024/2/18
    今天把离线数仓的ads层写完了。还把可视化报表、海豚调度器跑通了。到现在,还剩下一个即席查询。现如今整个数仓79张表。不过在写的过程中,可以感觉到,还有一部分表没有写。如果要全部加上,可能还得再加二十几张表吧。    ......
  • 【60行代码解决】2024年最新版python爬虫有道翻译js逆向
    一、表单参数sign加密sign:c0f36866a9c650144ed5bac4eba532a7这种32位一般是MD5加密1.搜索sign:2.点击去分别在每个**sign:某某某**处打上断点结果在这个断点断住了3.原代码constu="fanyideskweb",d="webfanyi"functionj(e){returnc.a.createHash......
  • 2024-2-18 数论学习笔记
    zak讲数论专题,好难,听不懂,整理一下。借鉴了zak的课件。还没写完呐,还会更新的。目录一、线性筛二、Dirichlet前缀和三、整除分块四、莫比乌斯函数例一一、线性筛筛出\(n\)以内的所有质数。\(n≤10^8\)。直接埃氏筛是\(O(n\ln\lnn)\)的,但是一个合数会被筛多次,......
  • .NET周刊【2月第1期 2024-02-04】
    祝大家新年快乐,龙年大吉~国内文章C#/.NET/.NETCore优秀项目和框架2024年1月简报https://www.cnblogs.com/Can-daydayup/p/18000401本文介绍了公众号“追逐时光者”定期分享的C#/.NET/.NETCore优秀项目和框架,包括项目介绍、功能特点、使用方式和功能截图,并提供了源码地址。文......
  • 2024-02-18-物联网C语言(7-字符串处理函数)
    7.字符串7.1获取字符串的长度函数-strlen头文件:#include<string.h>函数定义:size_tstrlen(constchar*s)参数:s-指定的字符串返回值:当前字符串的长度#include<stdio.h>#include<string.h>intmain(intargc,charconst*argv[]){//使用strlen获取字符......
  • 2024.2.18 近期练习
    P4764值域为\([l,r]\)的生成森林,也就是把值\(\gel\)的边拿出来生成森林,其中边\(\ler\)的权值和。我们现在要求所有\(l\),$\gel$边的生成森林中边有哪些。考虑从大往小加边,设当前加入第条边\((u,v,w)\)。因为这条边最小,所以这条边必选。若\(u,v\)不连通,那么直接......
  • 闲话2.18
    晚上开始模拟费用流了......
  • winter 2024 第三四周周报
    内容week3day1https://www.cnblogs.com/bible-/p/18018423这天是打寒假牛客2,请假了后面补的题,补了10道吧,感觉这些题花点时间都是可以写的,但是赛时真的很容易被卡,板子题也挺多,线段树、树状数组、字典树(太久不写有点忘了)week3day3https://www.cnblogs.com/bible-/p/18011488打......
  • [2024 AtCoder 比赛历程]
    2024.1.20ABC337-G题目大意:给定一棵树,对于树上的每个点$u$,定义$f[u]$表示满足点$w$在点$u$到点$v$的路径中,且$w>v$的点对$(w,v)$的数量。$u$可以等于$w$。解法:比赛时先考虑将一个点钦定为$w$时,该点对其他点的贡献。发现对于一个点,它可以通过它的一个子树内......