浅见Tarjan算法与无向图连通性
无向图的割点和桥
定义
割点:删除这个点时图将不再连通
割边:删除这条便时图将不再连通
时间戳
在图的深度优先搜索中的顺序(第几个被访问)
搜索树
在深搜时形成的树
图一为一张无向连通图,中间的为起点,红边为“发生递归”的边
图二就是搜索树了,编号为时间戳
追溯值
追溯值为low[],low[x]表示x及x的能到达的节点的dfn最小值
割边的判定法则
无向图(x, y)是桥,当且仅当在搜索树上存在x的一个子节点y,满足:
low[y] > dfn[x]
模板
割点判定法则
如果x并不是树的根节点,则x是割点当且仅当搜索树上存在一个x的子节点y,满足:
low[y] >= dfn[x]
特别的,当x为树的根节点且有2个及以上的子树时,x也为割点
模板
无向图的双联通分量
若一张无向联通图不存在割点,则是 点双联通图
若一张无向联通图不存在割边,则是 边双联通图
无向图的极大点双联通子图叫做 “点双联通分量”
无向图的极大边双联通子图叫做 “边双联通分量”
定理
一张无向连通图是“点双联通图”,当且仅当满足下列2个条件之一:
1 图的节点数<=2
2 图中的任意两点有不小于2条的不重复的路径可以互相到达,即在一个简单环中
边双求法
只需要求出图中所有的割边,把这些割边删掉后,会出现若干个连通块,每一个连通块就是一个边双
边双模板
点双求法
点双其实就是割点向自己每一条出边进行深搜所能遍历到的点(遇到另一个割点不行)
我们可以在tarjan中维护一个栈,方法:
1 当一个节点第一次被访问时,把该节点入栈
2 当判定割点生效时,无论x是否为根,都要:
(1)从栈顶不断弹出节点,直到弹出节点y
(2)刚才弹出的点构成了一个点双
点双模板
欧拉路问题
定义
欧拉回路:在图中经过每一条边一次并且仅一次的回路叫作欧拉回路
欧拉路径:在图中经过每一条边一次并且仅一次的路径叫作欧拉路径
欧拉图:有欧拉回路的图
半欧拉图:有欧拉路径但是没有欧拉回路的图
事实上 欧拉回路就是一条特殊的欧拉路径
定理
1 无向图G为欧拉图,每个节点的入度都为偶数
2 无向图G为半欧拉图,除起点终点入读为奇数,剩下的节点的入度为偶数
模板