算法导论 拓扑排序、强连通分量(备忘)
其实书上写很清楚了,只是写一下自己的理解备忘,没什么技术含量。
拓扑排序:
TOPOLOGICAL-SORT(G) 可为有向无环图产生其拓扑排序,要证明这个算法的正确性,只要证对于任意边 (u,v),有 f[v] < f[u]。因为在TOPOLOGICAL-SORT(G)算法中,总是令 f 值较大的点排在队列的前面,即“去除”(并不是真的删掉)那些 f 值较大的点。首先,当探索到 (u,v) 这条边时,v 一定不为灰色。首先,因为 u 为灰色,所以 v 一定不为灰色。再者,若 v 为白色,那么它是 u 的后续节点,有 f[v] < f[u];如果 v 是黑色的,显然有 f[v] < f[u]。综上,f[v] < f[u]。
强连通分量:
定义:任意两点都可互达的点的最大集。
算法的不严格分析:(画图理解)
一个强连通分量可以看成是一个复杂一些的圆,圆上的点可以互连。这样即使将边的方向反转,也不会改变连通性。比如 a,b,e 可以以三种顺序出现在 DFS 中,即 b、e、a,e、a、b,a、b、e。若加入图中的其他点则没有这样的性质。
书上用的 Kosaraju 算法算法。第三行要从 f 值最大的点开始深度优先遍历。f 值最大的点(用 b 表示)可以看作是其他点的根,该点到其他点的边可以看作该点所在连通分量到外部分量的出口。由于第二行已将边反转,所以这些出口无效了,b 只与一少部分的点相连,而这一少部分的点与 b 共同构成一个强连通分量。