我无法理解Kosaraju的算法,用于查找有向图的强连通分量。这是我在笔记本上的内容(我是学生:D):
我有这个例子:
从E开始的第一步之后,标签是:
所以事情就是这样:DFS在有向/无向图中有区别吗? 我做了第一步的心理测试,忽略了箭头(就像它是无向的),只有E(当然)和#2的正确#1,但#3落在J上,而不是K.所以我想也许我应该尊重箭头,并考虑到DFS做了,但是在从E开始的第一次传球后,我无法从G(这是#2)去任何地方,所以我被卡住了那里。
在我不知道的有向图上有什么关于DFS的吗?我只在无向图上教过DFS!
答案 0 :(得分:1)
你的第二步是不完整的。见Wikipedia:
Kosaraju的算法如下:
- 设G是有向图,S是空堆栈。
- 虽然S不包含所有顶点:
- 选择不在S中的任意顶点v。执行从v开始的深度优先搜索。每次深度优先搜索完成展开顶点u时,将u推到S 。
- 反转所有弧的方向以获得转置图。
- 虽然S是非空的:
- 从S弹出顶部顶点v。在转置图中从v开始执行深度优先搜索。该组访问顶点将给出包含v的强连通分量;记录这个并从图G和堆栈S中删除所有这些顶点。等效地,可以使用广度优先搜索(BFS)代替深度优先搜索。
所以你不应该只对最后一个顶点和第一个顶点做一些事情,而是在DFS中使用每个顶点。
另请注意,您应该backtracking - 当您无法继续前进时,您将转到上一个顶点并从那里继续。
不,你不能将它视为无向图 - 边缘的方向很重要。
因此,从E
开始,您可以转到F
,然后转到G
,然后返回F
,再转到H
,然后K
,然后I
,然后J
,然后回到I
,K
,H
,F
,最后E
,已将所有访问过的顶点推到堆栈上。