kosaraju算法 翻转图G,两次深搜,遍历连接,后历入栈;
任意有向图G,对其边方向翻转产生图GREV,对于G任意节点开始进行DFS,先遍历后节点入栈S,
DFS(vertex v)
{
DFS(V->NEXT);
PUSH V IN S;
}
直至所有节点入栈后将栈顶元素推出作为起点,对GREV进行DFS,先出栈再遍历节点,
DFS(vertex v)
{
POP V OUT S;
DFS(V->NEXT);
}
每深度遍历一个节点SCC规模加1,一个SCC形成及遍历到路径末时重新选取栈顶元素进行遍历,重复过程直至栈空。
1->2
2->8
3->2
3->4
4->9
4->5
5->7
7->6
7->9
7->1
8->1
9->8
9->6
从1开始DFS,1->2->8,则栈S数据为【1,2,8】(右边为栈底)
从非栈中顶点例如3开始DFS,3->4->9->6,则栈S数据为【3,4,9,6,1,2,8】