强连通分量算法背后的逻辑(正确性)(DFS的应用)

时间:2013-12-30 08:17:42

标签: algorithm graph graph-algorithm

“如果每个顶点都可以从其他每个顶点到达,那么定向图就会被强烈连接”。

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上读了一些答案,但没有给我正确的感觉。所以请以逻辑方式解释,举例说明。提前谢谢。

1 个答案:

答案 0 :(得分:2)

以下是该算法的解释: -

  1. 完成时间: - SCC可以是可视化的单个节点,我们可以从中形成图形。由SCC形成的图形总是DAG(有向无环图),其中存在源顶点和汇点顶点,就好像图形具有循环,然后循环中的节点将组合成单个SCC。形成源的SCC将仅具有输出边缘,而接收器仅具有输入边缘。通过这种逻辑,您可以推断出更接近源的SCC将具有更高的完成时间并且更接近下沉将具有更低的完成时间。

  2. 转置: - 当您进行图形转置时,源成为接收器,接收器成为源,但图形的SCC保持不变,只有它们的周期反转。

  3. DFS: - 我们开始计算具有更高完成时间的节点上的DFS,这些节点在SCC中更接近原始图形中的源。首先我们从SCC开始,它是原始的源,但现在它是接收器。现在我们知道接收器没有传出边缘,因此我们在其上评估DFS,我们只访问属于该SCC的节点,因此我们可以将它们组合成一个。当访问第一个SCC时,只有它的传出边缘的SCC现在变成新的接收器,它在原始图形中具有第二高的完成时间,所以现在我们可以做DFS来获得它的组件。

  4. 为了更清晰,您可以搜索 Kosaraju的SCC算法