簡體   English   中英

通過DFS在圖形中查找強連接的組件

[英]Finding Strongly Connected Components in a graph through DFS

我正在閱讀有關BFS和DFS的圖形算法。 當我分析通過DFS在Graph中查找強連接的組件的算法時,我想到了一個疑問。 為了找到強連接的組件,書(核心人員)做了什么,首先在圖上運行DFS以獲取頂點的完成時間,然后再次以結束時間的降序在圖的轉置上運行DFS。這是我們從第一個DFS獲得的。 但是我無法理解為什么必須根據完成時間運行第二個DFS。 我的意思是,即使我們直接在圖的轉置上運行DFS(忽略結束時間),它是否也可以為我們提供連接的組件,因為通過進行轉置,我們已經阻塞了通往其他組件的路徑。

編輯-這是斯坦福大學關於該主題的一些很好的深入視頻:

http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=IntroToAlgorithms (請參見6.直角圖的連接性)

我的解釋:

如果您沒有根據第一個dfs的完成時間減少來運行第二個dfs,則可能會將整個圖形錯誤地標識為單個強連接組件(SCC)。

在此處輸入圖片說明

請注意,在我的示例中,節點d始終比第一個dfs具有最少的完成時間。 節點abc將具有最高的完成時間。 假設a具有最高的完成時間,因此如果我們根據減少的完成時間運行第二個dfs,則a將是第一個。

現在,如果您從G的轉置中以節點d開始運行第二個dfs,則會生成一個包含整個圖的深度優先目錄林,因此得出結論,整個圖是SCC,這顯然是錯誤的。 但是,如果以a開頭dfs,則不僅會發現abc為SCC,而且重要的部分是它們將被標記為灰色或黑色, 以表示已訪問 然后,當您繼續在d上執行dfs時,就不會遍歷其SCC,因為您會意識到其相鄰節點已被訪問。

如果您查看DFS的cormens代碼,

DFS(G)
1 for each vertex u in G.V
2     u.color = WHITE
3     u.π = NIL
4 time = 0
5 for each vertex u in G.V
6     if u.color == WHITE
7         DFS-VISIT(G, u)

DFS-VISIT(G, u)
1 time = time + 1 // white vertex u has just been discovered
2 u.d = time
3 u.color = GRAY
4 for each v in G.adj[u]
5     if v.color == WHITE
6         v.π = u
7         DFS-VISIT(G, u)
8 u.color = BLACK // blacken u; it is finished
9 time = time + 1
10 u.f = time

如果您不使用減少完成時間,那么DFS的第6行將只適用一次,因為DFS-VISIT會遞歸訪問整個圖形。 這將在深度優先的林中生成一棵樹,並且每棵樹都是SCC。 單棵樹的原因是因為樹是由其前任為零的根節點標識的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM