簡體   English   中英

通過一次創建圖形並查找強連接的組件(不僅僅是Tarjan!)

[英]Creating a graph and finding strongly connected components in a single pass (not just Tarjan!)

我有一個特殊的問題,即有向圖的每個頂點正好有四個指向外部的路徑(可以指向相同的頂點)。

在開始時,我只有起始頂點,並且使用DFS查找/枚舉所有頂點和邊。

然后,我可以使用類似Tarjan的算法的方法將圖形分解為緊密連接的組件。

我的問題是,是否有比發現圖然后應用算法更有效的方法。 例如,是否有一種方法可以將兩個部分結合起來以提高效率?

為了避免在一開始就“發現”圖形,Tarjan算法需要的關鍵特性是,在執行該圖形的任何時候,它都應僅依賴於迄今為止已探索的子圖,並且該圖形只能擴展通過枚舉一些已經訪問過的頂點的鄰居來探索這個區域。 (例如,如果從一開始就需要知道圖中的節點或邊的總數,那么您將被沉沒。)從Wikipedia頁面上看,該算法確實確實具有此屬性,所以沒有,您無需在開始時執行單獨的發現階段-您可以for each (v, w) in E do的行上“偷懶地”發現每個頂點(枚舉v的所有鄰居,就像您當前在v中所做的那樣)發現DFS),並for each v in V do (只需選擇v作為您在上一步中已發現為aw的任何頂點,但尚未通過調用strongconnect(v)來訪問它)。

就是說,由於您的初始DFS發現階段僅需要線性時間,如果消除它會大大加快工作速度,我會感到驚訝。 如果您的圖形太大而不能容納在緩存中,則總時間可能減半。

暫無
暫無

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

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