连通分量专题

图上问题->树上问题->序列问题

连通分量专题

强连通分量(SCC)
对于一个有向图,当其中任意两点都能互相到达时,我们认为这是强联通的

int dfn[N],low[N],belong[N],cnt,tot;
bool instack[N];
vector<int>scc[N];
stack<int>st;
void dfs(int u){
	dfn[u]=low[u]=++cnt;
	st.push(u);instack[u]=1;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(!dfn[v]){
			dfs(v);
			low[u]=min(low[u],low[v]);
		}else if(instack[v])low[u]=min(low[u],low[v]);
		//v has gone to u,u can also to v
	}
	if(low[u]==dfn[u]){
		++tot;
		while(st.top()!=u){
			belong[st.top()]=tot;
			instack[st.top()]=0;
			scc[tot].push_back(st.top());
			st.pop();
		}
		belong[u]=tot;
		scc[tot].push_back(st.top());
		instack[u]=0;
		st.pop();
	}
}

双联通分量(BCC)
双联通分量仅存在于无向图

在一张连通的无向图中,对于两个点 u 和 v,如果无论删去哪个点(只能删去一个,且不能删 u 和 v 自己)都不能使它们不连通,我们就说 u 和 v 点双连通。

边双
边双连通具有传递性
在无向图中,对于任意两个点 u 和 v,如果无论删去哪条边都不能使它们不连通,我们说该图边双联通。

点双
点双连通不具有传递性
在无向图中,对于任意两个点 u 和 v,如果无论删去哪个点都不能使它们不连通,我们说该图点双联通。

void dfs(int u,int fa){
	int son=0;
	dfn[u]=low[u]=++cnt;
	st.push(u);
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(!dfn[v]){
			son++;
			dfs(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				++tot;
				while(st.top()!=v){
					bcc[tot].push_back(st.top());
					st.pop();
				}
				bcc[tot].push_back(st.top());
				st.pop();
				bcc[tot].push_back(u);
				//因为u可能同时也在别的点双联通分量中,所以不能直接pop(u)
				//因为栈内还存在别的双联通分量,所以只pop到v
			}
		}else if(v!=fa)low[u]=min(low[u],dfn[v]);
	}
	if(!fa&&!son)bcc[++tot].push_back(u);
}

割点
对于一点u,若删掉u,连通块数量增加1,则该点为割点
对于割点,我们可以发现,割点dfs子树内的任意一个点,都访问不到割点的祖先节点。
所以如果子节点的low大于等于当前点,则当前点为割点
(要特判当前点是root的情况,防止你是链的端点)

割边
对于一条边e,若删掉e,连通块数量增加1,则该点为割边
对于割边,我们可以发现,割边dfs子树内的任意一个点,都访问不到割边的祖先节点。
所以如果子节点的low大于等于当前点,则当前边为割边
(要特判当前点是root的情况,防止你是链的端点)

2-SAT问题
有若干的要求 x1成立 或 x2 成立, x3不成立 或 x4 成立
条件1我们可以转化成 A!BB!A
条件2我们可以转化成 !A!BBA
对于每个数值我们建两个点,表示该条件成立或不成立。
A 经过若干点指向 !A ,且 !A 经过若干点指向 A ,则该条件不成立。
因为可能 A!A 但是 !AA,所以我们从编号小的强联通分量开始选。

posted @   流泪的小酒窝  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题