簡體   English   中英

O(m+n) 算法來檢查有向圖是否是單邊連接的

[英]O(m+n) algorithm to check if a directed graph is unilaterally connected

給定一個有向圖 G=(V,E) 我如何檢查它是否是單邊連接的,即對於任何兩對頂點 a 和 b,至少滿足以下條件之一:

  1. 有一條從 a 到 b 的路徑。
  2. 有一條從 b 到 a 的路徑。

使用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 。 這是一個偽算法:

  • 首先找到原始 Graph 的 SCC。 在您的每個 SCC 中,都有一條從一個頂點到另一個頂點的路徑。
  • 將新發現的 SCC 圖壓縮為新圖。 這個想法是將所有屬於 SCC 1的節點視為新圖的節點1 ,依此類推
  • 現在,我們需要運行一個 DFS 來檢查是否只有一個連接的組件。 但是我們不能只從任何節點運行 DFS,因為這是一個有向圖。 我們使用頂部排序來查找拓撲順序,然后運行 ​​DFS 來檢查是否只有一個組件。 如果有多個,則該圖不是單邊的。

角箱

如果最初的原始圖是森林(又名斷開),則它不是單邊的。

復雜

查找SCC需要 2 個DFS Top Sort 也需要 1 DFS
所以,時間復雜度是你想要的O(V+E)

我沒有任何正式的證據。 但這應該有效。 如果您有任何困惑,請告訴我。

暫無
暫無

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

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