[英]O(m+n) algorithm to check if a directed graph is unilaterally connected
給定一個有向圖 G=(V,E) 我如何檢查它是否是單邊連接的,即對於任何兩對頂點 a 和 b,至少滿足以下條件之一:
使用Tarjan 算法找到強連通分量。 SCC 中的每個節點都可以從任何其他節點到達,因此就它們可以到達和被哪些節點到達而言,它們是等效的。 將每個 SCC 折疊成一個頂點,如果原始圖是單邊的,則生成的 DAG 將是單邊的。
如果 DAG 是全序,即如果只有一個拓撲順序,則 DAG 是單邊 iff。 如果有一條從 A 到 B 的路徑,那么 A 必須在 B 之前。如果有從 B 到 A 的路徑,那么 B 必須在 A 之前。你不會同時擁有兩者,因為圖現在是無環的。 如果 A 和 B 之間沒有路徑,那么它們是無序的,並且圖至少有 2 個拓撲順序——一個 A 在 B 之前,一個 B 在 A 之前。
檢查全序的一種快速方法是使用 Kahn 算法進行拓撲排序,並檢查以確保每次迭代時下一個頂點只有一個選擇。
用於查找 SCC、折疊 SCC 的 Tarjan 算法和用於拓撲排序的 Kahn 算法都在 O(V+E) 時間內運行。
這個想法是使用SCC
(強連接組件)和 Top Sort 。 這是一個偽算法:
1
的節點視為新圖的節點1
,依此類推如果最初的原始圖是森林(又名斷開),則它不是單邊的。
查找SCC
需要 2 個DFS
。 Top Sort 也需要 1 DFS
。
所以,時間復雜度是你想要的O(V+E)
我沒有任何正式的證據。 但這應該有效。 如果您有任何困惑,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.