连通分量

图论 连通分量

0.1 概述

图论中,或者説OI中研究的连通分量主要有三种:强连通分量、点双连通分量、边双连通分量。本文并不打算着重讲述\(tarjan\)算法的具体实现,默认读者已掌据此前置知识。

1.1 强连通分量

强连通分量是指:在有向图中,强连通分量中的任意两点(\(u\),\(v\)),存在\(u\rightarrow v\)\(v\rightarrow u\)的两条不同路径。

极大强连通分量:无法继续扩张的强连通分量。在通常语境下,一般默认“强连通分量”指的就是"极大强连通分量"

算法实现:\(tarjan\)算法可以做到\(O(n)\)效率地求解。

1.2 例题:[USACO15JAN]草鉴定Grass Cownoisseur

洛谷传送门

可以发现,将图缩点染色后,一个分量内的点之间可以任意到达。即:答案的最小值等于1号草场所处分量的大小。

在已经缩点后的图上计算由1号草场所在分量向其余分量求最长路\(dis1\),再求由其余分量向1号草场所在分量的最长路\(dis2\)(建反边)

对于原图上存在的一条边\(u\rightarrow v\),如果这两个点同处一个连通分量上,在这条边上逆行一次是没有任何意义的;但是如果这两个点并不在一个连能分量上,那么可以:先走到\(v\)所在的分量dis1[v分量],再逆行回到u分量,然后回到1号草场分量dis2[u分量],最后逛完1号分量siz[1号分量]。因此:

ans=max(ans,dis1[v]+dis2[u]+size[1分量]

2.1 点双连通分量

点双连通分量指:无向图中,分量中的任意两点间存在经过的点完全不相同的两条路径。

连通分量_第1张图片

2.2 性质

割点起到类似“分割”的作用,分割两个点双连通分量。

连通分量_第2张图片

一个割点最多出现在两个点双连通分量上,而非割点则最多出现在一个点双连通分量上。

注意到这一条性质后,其实点双连通分量的求解就不是一个难事了。一个点双连通分量最早会在割点或者图的根上被探测到。当\(tarjan\)找到一个割点后,将栈中的所有点和这个割点归纳到一个点双连通分量中。栈中的所有点弹出,但这个割点不弹出。

void tarjan(int u){
	DFN[u]=LOW[u]=++DFN[0]; sta[++top]=u; in[u]=true;
	int cnt=0;
	tor(i,u){
		int v=edge[i];
		if(!DFN[v]){
			cnt++;
			tarjan(v);
			LOW[u]=min(LOW[u],LOW[v]);
			if(LOW[v]>=DFN[u]){
				tot++;
				if(u!=root) ge[u]=true;
				while(sta[top]!=u){
					in[sta[top]]=false;
					lis[tot].push_back(sta[top]);
					top--;	
				}
				lis[tot].push_back(u);
			}
		}
		else if(in[v]) LOW[u]=min(LOW[u],DFN[v]);
	}
	if(u==root&&cnt>=2) ge[u]=true;
}

2.3 例题:[HNOI2012]矿场搭建

我是传送门

对图做一次点双连通分量的归纳,分情况讨论。

连通分量_第3张图片

连通分量_第4张图片

连通分量_第5张图片

3.1 边双连通分量

边双连通分量:无向图中,分量中任意两点存在边完全不相同的两条路径。

连通分量_第6张图片

边双连通分量就要有好理解很多,不同边双连通分量间被桥隔离。而求解方法也正是用\(tarjan\)求出桥后,跑一遍dfs之类的。

3.2 例题 [JSOI2012]越狱老虎桥

洛谷传送门

可以发现,可以被特工破坏掉的电网一定是图中桥。求出边双连通分量后,新图是一棵边集恰好是原图中桥的集合。将电网按权值排序,若此电网与之前的电网在一条链上则不能被割掉,否则输出答案。

你可能感兴趣的:(连通分量)