2011-06-22 65 views
10

我們知道有「聯合並找到」不相交的集合。 http://en.wikipedia.org/wiki/Union_find對「Union and find」的反向操作

但是如何做反向操作呢?考慮一個N節點與E邊相連的集合(實際上是一個圖)。 在每一步我們都想刪除一些邊,並檢查這個刪除操作是否導致另一個不相交集。是否有可能像在「聯盟和發現」中一樣快速地做到這一點?

P.S這不是功課,我們有假期:)

回答

0

所以你的問題是如何有效檢測Bridge?這可以在線性時間內完成(另請參閱鏈接)。

+0

鑑於@Chris顯然希望重複執行此操作(他在每個步驟中都會這樣說),我們可以更高效地在每個階段檢測網橋。 – borrible

+0

我認爲如果您運行該橋找到算法並標記橋,並注意除非一個邊被添加到圖中,否則不會出現新橋;所有存在於該圖中的橋保留爲橋,因爲刪除了邊並且只有在刪除不是橋的邊時纔會出現新的橋;所以您只需要重新運行兩個子圖上的算法就可以通過剛刪除的非橋邊連接。 –

1

在Kruskal算法中使用聯合查找,該算法重複添加不構成循環的最小權重邊。在reverse-delete algorithm中使用了一個相反的想法 - 只要它不斷開圖形就消除最大權重的邊緣,這似乎可以利用一些複雜的數據結構(參見Wikipedia)。

+0

下一個漂亮的鏈接,但太廣泛,沒有真正的代碼看:( – Spinach