图论: 割点、桥(割边)、强连通分量 学习笔记

//无向图的割点和桥: 

//cutnode[u]=true表示u是一个割点 
//cutedge(u,v)=true表示(u,v)是一条割边 
//Color[u]: 黑 访问完毕 灰 正在访问 白 未访问; 

Tarjan(u,father){
	DFN[u]=LOW[u]=++time;
	//LOW[u]: u以及u的子孙所能到达的最小时间戳
	Color[u]=灰;
	put u into a stack; //入栈 
	for each e=(u,v)
		if (color[v]==白){
			Tarjan(v,u);
			LOW[u]=min(LOW[u],LOW[v]);
			//若存在边(u,v),且DFN[u]<LOW[v],则(u,v)为一条割边
			if (DFN[u]<LOW[v]) cutedge(u,v)=true;
			
			//若存在边(u,v),且DFN[u]<=LOW[v],则u为一个割点;
			//当u为根,且至少有2棵子树
			//用son[u]记录u的儿子个数,当color[v]=白说明多一个儿子;
			son[u]++;
			if ((u==root && son[u]>1) || (u!=root && DFN[u]<=LOW[v]))
				cutnode[u]=true;
				
		}	else
		if (v!=father)
			LOW[u]=min(LOW[u],DFN[v]);
	Color[u]=黑; 
	
		//图中一些概念: 
		//点连通度: 最小割点集合中的点数
		//边连通度: 最小割边集合中的边数 
		//双连通分支: 可理解为任意两点之间有两条路径的极大的子图 
		//如果一个无向连通图的点/边连通度大于1,则称该图是点/边双连通的;
	
	//当访问结束回退时,若LOW[u]=DFN[u],则有一个双连通分支;
	if (LOW[u]==DFN[u]) pop until u;
		//弹出元素属于同一个双连通分支;
	
	//双连通分支缩点后会变成一棵树 
}



//有向图的强连通分量(分支):

//强连通: 有向图中两个点之间至少有1条路径
//强连通分量: 极大强连通子图; 

//与无向图的双连通分支求法一致;

//强连通分支会形成DAG(有向无环图)
 
 
 
//考虑以下问题: 
 
	//假设有一个无向图
	//求解最小加几条边,使得不存在桥
		//缩点后形成了一棵树
		//这棵树中度数为1的结点个数为x
		//答案就是(x+1)/2 
		//考虑消除所有度为1的结点即可,连边可以增加它们的度数;
	 

	//假设有一个有向图
	//求解最小加几条边,使得整张图强连通
		//首先求强连通分量缩点
		//然后在新的缩点的图中
		//求出入度为0点的个数为a,出度为0的点的个数为b
		//答案就是max{a,b}
		//想法也是简单的,尽量产生环; 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拓扑排序、割点割边以及强连通分量图论中的重要概念和算法。 1. 拓扑排序(Topological Sorting): 拓扑排序是对有向无环图(DAG)进行排序的一种算法。拓扑排序可以得到一个顶点的线性序列,使得对于任意一条有向边(u, v),在序列中顶点u都排在顶点v的前面。拓扑排序常用于表示任务之间的依赖关系,例如在工程项目中确定任务的执行顺序。 2. 割点割边Cut Vertex and Cut Edge): 割点是指在无向连通图中,如果移除该顶点以及与该顶点相连的所有边,会导致图不再连通,则该顶点被称为割点割边是指在无向连通图中,如果移除该边,会导致图不再连通,则该边被称为割边割点割边的存在可以影响到图的连通性,因此在网络设计、通信等领域有着重要的应用。 3. 强连通分量(Strongly Connected Component): 强连通分量是指在有向图中,如果对于图中任意两个顶点u和v,存在从u到v和从v到u的路径,那么称u和v在同一个强连通分量中。强连通分量可以将有向图的顶点划分成若干个子集,每个子集内的顶点之间互相可达。强连通分量可以用于分析网络中的关键节点,寻找网络的可靠性,以及在编译器设计中进行代码优化等领域。 这些概念和算法在图论中都有着广泛的应用,并且还有许多相关的算法和扩展。深入理解和掌握这些概念和算法,可以帮助我们更好地理解和解决各种与图相关的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值