“如果每个顶点都可以从其他每个顶点到达,那么定向图就会被强烈连接”。
Coreman中给出的算法如下: -
STRONGLY-CONNECTED-COMPONENTS (G)
1. Call DFS(G) to compute finishing times f[u] for all u.
2. Compute GT
3. Call DFS(GT), but in the main loop, consider vertices in order of decreasing f[u] (as computed in first DFS)
4. Output the vertices in each tree of the depth-first forest formed in second DFS as a separate SCC.
我试图理解这个算法的正确性,以及第3步背后的逻辑,但没有得到。请帮我承担这个,给我这个背后的感觉。
我在SO上读了一些答案,但没有给我正确的感觉。所以请以逻辑方式解释,举例说明。提前谢谢。
答案 0 :(得分:2)
以下是该算法的解释: -
完成时间: - SCC可以是可视化的单个节点,我们可以从中形成图形。由SCC形成的图形总是DAG(有向无环图),其中存在源顶点和汇点顶点,就好像图形具有循环,然后循环中的节点将组合成单个SCC。形成源的SCC将仅具有输出边缘,而接收器仅具有输入边缘。通过这种逻辑,您可以推断出更接近源的SCC将具有更高的完成时间并且更接近下沉将具有更低的完成时间。
转置: - 当您进行图形转置时,源成为接收器,接收器成为源,但图形的SCC保持不变,只有它们的周期反转。
DFS: - 我们开始计算具有更高完成时间的节点上的DFS,这些节点在SCC中更接近原始图形中的源。首先我们从SCC开始,它是原始的源,但现在它是接收器。现在我们知道接收器没有传出边缘,因此我们在其上评估DFS,我们只访问属于该SCC的节点,因此我们可以将它们组合成一个。当访问第一个SCC时,只有它的传出边缘的SCC现在变成新的接收器,它在原始图形中具有第二高的完成时间,所以现在我们可以做DFS来获得它的组件。
为了更清晰,您可以搜索 Kosaraju的SCC算法