我正在学习Kosaraju算法,用于从Kosaraju algorithm 找到强连通分量 但我无法理解在完成时间的降序中进行dfs(G ^ T)的必要性是什么,即上面链接中的第3点所述。
答案 0 :(得分:1)
考虑一个简单的图,其中有两个顶点A和B,一个边从B到A(或G到T中的A到B)。如果你按照A和B的顺序对顶点进行dfs(G ^ T),那么你将它输出为一个强连接的组件。而它应该是两个独立的组件。
非正式地说,按照指定的顺序执行顶点的必要性是确保只有当你还可以首先“向下”G链接时才能“上升”G ^ T链接。
答案 1 :(得分:0)
拍摄一张只是路径的图表。
5 -> 4 -> 3 -> 2 -> 1
如果我们没有按照完成时间的降序对DFS进行转置,那么我们可以从例如4开始,并将{4,5}报告为一个组件。
答案 2 :(得分:0)
说你原来的图是这样的:
C1,C2,C3和C4 是图的强连接组件,可以包含任意数量的顶点。
如果我们的目标是找到图表中强连接的组件,那么最好的办法就是从C4中任意VERTEX开始DFS并标记他们的访问。
原因:因为 C4 是SCC并且没有来自C4的传出边缘,从C4的任何顶点启动DFS将仅访问C4的顶点没有外向顶点。
所以我们得到了第一个 SCC 。
下一步将从C2或C3的顶点开始DFS,因为C2(OR c3)是SCC,它将访问C2的所有顶点(OR c3),唯一的输出边缘是C4 WHOSE视频已被标记为访问,因此不包括在SCC中。
所以我们得到第二个 SCC 。
下一步是从C2启动DFS(如果之前是C3),否则启动C3(如果之前是C2)。它最终会访问 SCC 的顶点,原因已在上面提到。
最后,我们将从C1的顶点开始DFS,它将仅访问 SCC(C1)的顶点,原因已在上面提到。
现在我将回答您的问题
C4,C3,C2,C1 或 C4,C2,C3,C1 的顺序基本上是在完成时间减少时以顶点的顺序获得的对于下图(原始版本的反转)
也就是说,如果我们从上图的任何顶点启动DFS,那么我们按照完成时间减少的顺序获得的顶点列表将首先具有 C4的顶点,然后是C2的顶点,然后是C3的顶点和最后是C1的顶点或首先是C4的顶点,然后是C3的顶点,然后是C2的顶点,最后是C1的顶点。
如果我们不按照结束时间的降序启动DFS,假设我们从C1的任何顶点(即原始图的第二个DFS)启动DFS,DFS会做什么,它会列出图AS ONE SCC的所有顶点,第一个图表清楚地显示,因为从C1到C2,C3有从外边缘,我们可以从那里到达C4:
C2,C3,C4的顶点标记为未访问
或者说如果我们在从C4的任何顶点启动DFS之前从C2的任何顶点启动DFS,它会做的是将C2和C4的顶点列为一个SCC,因为C4顶点被标记为未访问。 /强>
因此,以完成时间递减顺序启动第二个dfs的主要原因是,只有该SCC的顶点列在dfs中并标记为已访问。