簡體   English   中英

查找最小頂點連通子圖

[英]Find Minimum Vertex Connected Sub-graph

首先,我不得不承認我不擅長圖論。

我有一個弱連通的有向圖G=(V,E) ,其中V約為 1600 萬, E約為 1.8 億。

對於給定的集合S ,它是V的子集( S的大小約為 30),是否有可能找到弱連接子圖G'=(V',E')其中SV'的子集V'但盡量保持V'E'的數量盡可能小?

G可能會發生變化,我希望有一種方法可以實時找到子圖。 (當一個進程正在寫入G時, G將被鎖定,因此當您的子圖計算仍在運行時,不要擔心G會被更改。)

我目前的解決方案是為S中的每對頂點找到最短路徑並合並這些路徑以獲得子圖。 結果還可以,但是運行時間非常昂貴。

有沒有更好的方法來解決這個問題?

如果您對當前方法的結果感到滿意,那么至少可以更快地完成:

將 S 中的每個頂點分配給不相交集合數據結構中的集合: https://en.wikipedia.org/wiki/Disjoint-set_data_structure 然后:

  • 對圖進行廣度優先搜索,從 S 作為根集開始。
  • 當您搜索發現一個新頂點時,請記住它的前任並將其分配給與其前任相同的集合。
  • 當您發現連接兩個集合的邊時,合並集合並按照前任鏈接將連接路徑添加到 G'

另一種考慮做完全相同的事情的方法:

  1. 根據與 S 的距離對 E 中的所有邊進行排序。您可以為此使用 BFS 發現順序
  2. 使用 Kruskal 算法為 G 生成生成樹,按該順序處理邊緣 ( https://en.wikipedia.org/wiki/Kruskal%27s_algorithm )
  3. 在 S 中選擇一個根,並刪除任何不包含 S 成員的子樹。完成后,每個葉子都將在 S 中。

這不一定會找到最小的子圖,但會最小化它與 S 的最大距離。

暫無
暫無

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

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