簡體   English   中英

使用Boost Graph搜索DAG Graph?

[英]Using Boost Graph to search through a DAG Graph?

我需要搜索DAG圖,但是在看到所有其他指向其指向鏈接的節點之前,我不想經過一個節點。

是否存在現有的算法來處理這種特殊情況,深度優先搜索和呼吸優先搜索不適用於此遍歷順序。

即:

A -> B
B -> C
C -> D
A -> C

我不想在見過B和C之前就到達D。

您正在尋找的是Kahn(1962)的拓撲排序算法。 這不是BGL當前實現的基於DFS的拓撲排序算法,它訪問所有頂點並以相反的拓撲順序輸出結果,而是與BFS非常相似,並且以您在描述中所描述的方式訪問頂點第一段。 您必須自己編寫遍歷,但是算法很簡單。

請參閱拓撲排序Wikipedia條目中列出的第一個算法: http : //en.wikipedia.org/wiki/Topological_sorting 另請參見Sedgewick的“ C算法”中的程序19.8。

提示1:使用輔助數據結構來維護每個頂點的入邊數量,實際上不要執行“從圖形中刪除邊”部分。

提示2:對於一個工作正常的GPLV3示例,您可以在我的CoFlo控制流程圖生成和分析項目中,特別是文件topological_visit_kahn.h中,查看一下Kahn算法的實現: http://coflo.svn.sourceforge達網絡/ viewvc / coflo /中繼/ SRC / controlflowgraph / topological_visit_kahn.h?視圖=日志

因此,我的最新想法是,每當添加或刪除一條邊時,就對整個圖形進行拓撲排序,並存儲每個節點要遍歷的直接子節點的順序(這可能是編寫一個棘手的算法)。

然后,我進行了修改后的廣度優先搜索(如chaos所建議),並在以下bfs偽代碼中,修改了該行:

for each vertex v in Adj[u]

成為:

for each vertex v in OrderedAdj[u]

偽代碼:

BFS(G, s)
  for each vertex u in V[G]
    color[u] := WHITE 
    d[u] := infinity 
    p[u] := u 
  end for
  color[s] := GRAY 
  d[s] := 0 
  ENQUEUE(Q, s)
  while (Q != Ø) 
    u := DEQUEUE(Q)
    for each vertex v in Adj[u]
      if (color[v] = WHITE)
        color[v] := GRAY 
        d[v] := d[u] + 1  
        p[v] := u  
        ENQUEUE(Q, v)
      else
        if (color[v] = GRAY) 
          ...
        else 
          ...
    end for
    color[u] := BLACK
  end while
  return (d, p)

我相信這是實現此目標的最佳方法,但確實需要我編寫自己的bfs遍歷算法,還要在每個節點上存儲節點的順序(我希望避免的內存開銷),並編寫自己的dfs訪問者查找順序並將其存儲在緩存階段的節點上。

我感到驚訝的是,雖然沒有現成的方法,但是在我看來,導航dag圖形是一種相當普遍的方法。

您無法使用普通的圖遍歷算法來做到這一點,因為您需要算法神奇地掌握圖結構的知識,而該圖結構在不潛在違反其自身要求的情況下是無法遍歷的。 您將必須使用兩遍方法,該方法首先構建后向樹,以告訴您哪些節點與其他節點建立了連接,然后進行修改的廣度優先搜索,該搜索使用第一遍的信息來適當地延遲遍歷。 而且我懷疑某些圖形結構可能會在第二遍過程中造成死鎖。

首先進行拓撲排序,然后對排序后的圖進行深度優先搜索怎么樣?

那行得通嗎?

任何DAG至少具有一個葉節點。 刪除任何葉節點節點和所有傳入弧都將留下另一個DAG。 遞歸地,該較小的DAG還具有至少一個葉節點。 通過以這種方式遞歸刪除所有節點,最終根節點將成為葉節點。

如果現在顛倒了刪除節點的順序,則您將擁有一個具有所需屬性的遍歷順序。 通過最后訪問葉節點,可以保證首先看到所有父節點。

暫無
暫無

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

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