簡體   English   中英

從文本文件中檢測有向圖中的循環

[英]Detect Cycle In Directed Graph from text file

我正在嘗試從文本文件中讀取值,然后確定它表示的圖形是否為 DAG。 我想知道在時間效率方面解決這個問題的最快方法是什么。

這是文本文件

3
2
1,2,
2,3

我正在考慮使用給定的信息制作和鄰接列表,然后從那里開始。 任何幫助是極大的贊賞

一種方法,雖然可能不是最快的方法,是對圖進行拓撲排序 當且僅當算法失敗時,該圖才有循環(請參閱卡恩算法)。

運行時間為O(|V| + |E|) ,其中|V| 是頂點數和|E| 是邊的數量。

Bender 等人發表了一篇論文。 (Robert Tarjan 是作者之一), 一種新的增量循環檢測方法和相關問題,您可能想看一看。

另一篇相關論文是增量循環檢測、拓撲排序和強組件維護bu Haeupler 等人。 (Tarjan 又是作者之一)。

您可以使用深度優先搜索簡單地遍歷整個圖。 它的整體時間復雜度為O(|V| + |E|) , |V| 和 |E| 分別是頂點數和邊數。

當您使用 DFS 遍歷圖形時,您將遇到 3 種類型的頂點:

  1. 那些你還沒有涉足的。
  2. 您當前正在發現的那些。 (即本身或其子項)
  3. 你完全探索的那些(即包括它的后代)

在實現 DFS 時,您可以通過通常所說的為頂點着色來跟蹤每個頂點在給定時間所處的狀態。 基本上,您尚未開始探索的頂點(類型 1)將是白色的,您正在探索的頂點將是灰色的,而您完全發現(即耗盡)的頂點將是黑色的。

在相關說明中,當您的 DFS 運行時,它會遇到 4 種類型的邊,它們分別基於源頂點和目標頂點的類型,即 src 和 dest。

  1. 樹邊緣: src 是類型 2,dest 是類型 1
  2. 后緣: src 屬於類型 2,dest 屬於類型 2
  3. Forward Edge: src 是類型 2,dest 是類型 3,src 是 dest 的祖先
  4. Cross Edge: src 是類型 2,dest 是類型 3 並且 src不是dest 的祖先

盡管它們在大多數算法教科書中的圖算法部分都有廣泛的敘述,但前向邊和交叉邊與您的需求並不真正相關。 您需要考慮的只是在遍歷樹時跟蹤是否遇到后邊緣(即從一個灰色頂點到另一個灰色頂點)。

如果您確實遇到了后邊緣,則意味着您基本上具有從頂點u到其祖先v 的能力 Ancestor 在這種情況下感覺有點奇怪,因為這不是樹而是圖。 盡管如此,請記住,有向邊構成的關系類似於樹中的父節點和子節點所具有的關系,理解這個想法可能會更直觀。 畢竟,類型 1 的被稱為樹邊是有原因的,對吧?

總而言之,使用深度優先搜索探索所有頂點(即在探索圖中的一棵樹后不要放棄)並尋找后邊。 如果你找到一個,你就有一個循環。

暫無
暫無

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

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