强连通分量(Kosaraju算法)

求有向图的强连通分量除了大家熟知的trajan,还可以用Kosaraju
先说算法流程:
1,对原图dfs一遍,并将出栈顺序的逆序作为“伪拓扑序”
2,对原图够构反向图
3,按伪拓扑序在反向图上dfs,新遍历到的点都属于同一个强联通分量。

正确性证明:
s在反向图上dfs能够遍历到t,说明存在t到s的路径,而现在需要证明的就是存在s到t的路径。
我们知道,s的伪拓扑序小于t,也就是s后退栈,有两种情况:
1,dfs(t)start->dfs(t)end->dfs(s)start->dfs(s)end
2,dfs(s)start->dfs(t)start->dfs(t)end->dfs(s)end
第一种情况t到s不存在路径,所以只可能是第二种情况,也就是一定存在s到t的路径。

另外该算法具有一个性质:如果我们把求出来的每个强连通分量缩成一个点,并且用求出每个强连通分量的顺序来标记收缩后的结点,那么这个顺序就是强连通分量缩点后所形成的有向无环图的拓扑序列。

你可能感兴趣的:(kosaraju)