概念
点双连通: 在一个连通图中选任意两点,如果它们之间至少存在两条“点不重复”的路径,成为点双连通。
点双连通分量: 一个图中的点双连通极大子图。点双连通分量是一个“可靠”的图,去掉任意一个点,其他点仍然是连通的。也就是说,点双连通分量中没有割点。
边双连通: 在一个连通图中任意选两点,如果它们之间至少存在两条“边不重复”的路径,成为边双连通。
边双连通分量: 一个图中的边双连通极大子图。边双连通图中没有割边。
点双连通分量
求解点双连通分量和求割点密切相关。不同的点双连通分量最多只有一个公共点,即某一个割点;任意一个割点都是至少两个点双连通分量的公共点。
一条边相连的两个点视为一个点双。
计算点双连通分量一般用Tarjan算法,下面是算法的思路。
进行割点计算的DFS,在找到一个割点的时候已经完成了一次对某个极大双连通子图的访问。那么在进行DFS的过程中,把遍历过的点保存起来,就可以得到这个点双连通分量。
DFS的访问过程用栈来保存是最合理的,所以,在求解割点的过程中,用一个栈保存遍历过的边,然后每当找到一个割点,即满足关系low[v] >= num[u]
的点,就将栈里的边拿出来。
注意,放入栈中的不是点,而是边。 因为一个边只属于一个点双连通分量,而一个割点属于多个点双连通分量。如果进入栈中的是点,这个割点弹出来之后就只能给一个点双连通分量,它连接的其他双连通分量就会少了这个点。
练习:POJ 1523 SPF
边双连通分量
边双连通分量的计算用到了缩点的技术。
找出图G的所有边双连通分量。在DFS过程中,图G所有的点都生成一个low
值,low值相同的点必定在同一个边双连通分量中。DFS结束后,有多少low值就有多少个边双连通分量。
单个点视为一个边双。
练习:POJ 3352 Road Construction