连通的无向图G(V, E)的割顶是V中的一点,使得去掉此点后原图不连通。最简单的方法就是枚举V中的点,依次删除进行判断图是否连通,这需要
的复杂度。另外就是要Tarjan算法通过一遍DFS的信息求得所有的割点。
无向图的DFS会生成一颗路径树T,并且由于是无向图,图G只能有正向边(T边)和反向边(B边),路径树中存在正向边,故两点在树中连通,则必然在原图G中连通,因此需要考虑的是如何在T删除点u后,除了正向边,原图G中的反向边是否可以将原图连通。
u为割点有以下两种情况:
- u是T的根节点,并且有>=2个孩子节点
- u不是T的根节点,但u的孩子节点v中,存在v为根的子树内的所有点都无法到达u的祖先。
证明:
- u是根节点,并且有>=2个孩子节点,如果删去u则各个孩子节点为根的子树之间无法连通,并且由于是无向图G中反向边不会在子树之间存在,故无边将子树之间连通,故原图G也不连通。
- u不是T的根节点,在树T上删除点u,则u孩子节点各个子树的点无法只通过正向边同其它点连通,因此如果u孩子节点子树的后向边里也没有指向u祖先的点,那么u孩子节点子树的点就无法到达其它点,故u为割点。反过来,如果u子节点v的子树都存在到达u祖先的边的话,则这些子树之间可以通过先到达u的祖先,然后连通。
因此我们需要记录u点到达根节点的距离level,以及其孩子节点v所在子树能到达的u的祖先节点。到达根节点的距离可以在DFS过程中求得。关键是如何求出x子树所能到达的father(x)的祖先节点。最简单的方法就是记录v子树能到达的祖先节点集合anc(v),那么u子树能到达的祖先节点是所有孩子节点anc(v)的并集以及u能到达的祖先节点集合,然后删除不是u祖先节点的节点。这里就是Tarjan算法的精妙之处(PS:意思就是傻逼了,我也不知道robert tarjan是怎么想出来的,如果你知道的话请留言告诉我)了,上面的这个操作正好可以利用level来进行判断通过记录low(v),表示v以及v后代中能到达的u的祖先中最接近根的点。这样就可以在DFS过程中,计算low(v) = min(后向边到达的祖先点u(u不是v的父节点), low(v的后代))。
对于u不是T根节点的情况,如果存在v使level(u) <= level(low(v)),则u为割点。

















![[6*1\bmod 9 = 6, 6 * 2 \bmod 9 = 3, 6 * 3 \bmod 9 = 0]](http://gaoyusong.com/wp-content/plugins/latex/cache/tex_601bd775a7dd12438cff32df2a39550d.gif)

![[(6 * 1 + 1) \bmod 9 = 7, (6 * 2 + 1) \bmod 9 = 4, (6 * 3 + 1) \bmod 9 = 1]](http://gaoyusong.com/wp-content/plugins/latex/cache/tex_2e3668024791859813efafc1e8e6a916.gif)

![[(6 * 1 + 2) \bmod 9 = 8, (6 * 2 + 2) \bmod 9 = 5, (6 * 3 + 2) \bmod 9 = 2]](http://gaoyusong.com/wp-content/plugins/latex/cache/tex_54fb5badcb0c9b8b55029d38d2bb6c04.gif)






























