簡體   English   中英

使用不相交集數據結構,圖論

[英]Using disjoint-set data structure, graph theory

我正在練習解決空閑時間的編程問題。 我前段時間發現這個問題但仍然不知道如何解決它:

對於具有n個頂點和m個邊(小於2×10 6 )的給定無向圖,我需要將其頂點分成盡可能多的組,但是有一個條件:來自不同組的每對頂點通過邊連接。 每個頂點恰好在一個組中。 最后,我需要知道每個組的大小。

當我提出這個解決方案時,我感到很自豪:考慮原始圖的補充圖並使用Disjoint-set數據結構。 它給了我們正確的答案(不難證明)。 但這只是理論上的解決方案。 在給定的約束下,它非常非常糟糕,不是最優的。 但我相信這種方法可以巧妙地修復。 但是怎么樣?

有人可以幫忙嗎?

編輯:對於頂點為1到7和16個邊的圖:

1 3

1 4

1 5

2 3

3 4

4 5

4 7

4 6

5 6

6 7

2 4

2 7

2 5

3 5

3 7

1 7

我們有3組大小:1,2和4。

這些組分別為:{4},{5,7},{1,2,3,6}。 有連接不同組的每對頂點的邊,我們無法創建更多組。

我認為你唯一缺少的是如何處理稀疏圖。

讓我們從找到最大可能的完整圖表的角度考慮這一點,我可以做的唯一操作是將一組節點(比如v_1,...,v_k)組合在一起,並將新的超級節點邊緣僅提供給那些節點u連接到所有 V_1,...,V_K的。

如果圖形的邊數小於n ^ 2/4,則隨機采樣n節點對,注意哪些對未通過邊連接。 Union-find是一種簡單的編碼方式。 現在使用此隨機采樣找到的集合作為組重建圖形。 遞歸這個縮小的圖表。 (我不太清楚如何分析這一步驟,但我相信每個樣本重建周期都會將圖形大小至少降低一個常數因子,因此整個過程需要接近線性的時間。)

一旦你有一個相當密集的圖形(至少n ^ 2/4邊緣),你可以轉換為鄰接矩陣表示並完全按照你的建議 - 檢查所有節點對,每當你看到兩個節點時做一個聯合沒有邊緣連接,並讀取集合。

暫無
暫無

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

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