簡體   English   中英

在后邊緣中止Boost Graph DFS

[英]Abort Boost Graph DFS on Back Edge

我正在嘗試提高Graph算法的性能,但是遇到一些問題。

我的圖形typedef看起來像這樣:

typedef boost::adjacency_list<boost::multisetS, boost::vecS, boost::directedS, boost::no_property, indexProperty> graph_t;
typedef boost::graph_traits<graph_t>::vertex_descriptor vertex_descriptor_t;
typedef boost::graph_traits<graph_t>::edge_descriptor edge_descriptor_t;

我正在處理的圖形相當大,它具有約580萬條邊和100個頂點。

我在做什么如下:

  1. 確定圖的強連接組件
  2. 對每個組件執行“深度優先搜索”,以檢測圖中的循環。

我通過在圖形中搜索后沿來查找圖形中的循環。 對於我檢測到的每個循環,我必須執行更改圖形的操作。 (我必須從圖中刪除循環邊)。 刪除周期后,我重新啟動DFS以查找下一個周期。

我的問題是:

如何在后端檢測時終止DFS?

我做了一些研究,發現了以下問題: 關於stackoverflow的以下問題

在那里建議使用Boosts深度優先訪問。 但是,在文檔中說終止函數在調用discover_vertex之后立即被調用。 調用back_edge后是否可以終止?

另外,是否可以直接使用depth_first_visit,而無需復制上述問題所建議的boost源代碼?

到目前為止,我正在做的是將檢測到一個周期的標志存儲在訪問者中,並在訪問者的每個函數調用中檢查此標志。 這給dfs添加了許多不必要的函數調用,並且要花很長時間。

謝謝你的幫助!

澄清一下我正在使用的算法在geeksforgeeks點org / detect-cycle-in-a-graph中進行了描述(對不起,我不能發布兩個以上的鏈接)

我在偽代碼中所做的是:

 For each strongly connected component in g
   do
      perform dfs until first back edge
      perform some task on the cycle edges
      remove cycle edges from g
   until no cycle in DFS

@petr:為什么您認為不需要重新啟動dfs?

終止boost :: depth_first_search的典型解決方案是引發異常(您自己定義的類型)。 然后,您的代碼可以捕獲異常,執行所需的任何操作,然后繼續。

也就是說,我同意在每個后端重新啟動DFS的擔憂。 如果您具有緊密連接的組件,則可以僅刪除其根頂點邊緣的所有元素,然后在結果圖中找到SCC? 但是無論如何,這是algorithm.stackexchange.com的主題,如果您想中止DFS,則解決方案就是例外。

暫無
暫無

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

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