簡體   English   中英

在有向圖中檢測周期

[英]Detecting a cycle in a directed graph

在這里閱讀了關於在有向圖中找到循環的討論。 現在,OP聲稱我們需要驗證件事:

  1. uv有一個后沿
  2. v在遞歸堆棧中

為什么我們需要第二次測試? 您能舉個例子證明它的必要性嗎?

僅我們已經訪問v的事實是不夠的。 它允許我們從u轉到v ,但不能從v轉到u

簡單的圖形反例:

反

數字是遍歷順序。 我們的后緣為4到3,但沒有任何循環。

好吧,您可能對有向圖中的后沿定義和無向圖中的后沿定義感到困惑。 是的,它們是不同的。

無向圖中,后邊緣是從當前頂點到已訪問的頂點的邊緣。 (如您提到的鏈接中的OP)。
在有向圖中,后邊緣的定義不同。 有向圖的后邊緣是從當前頂點到GREY頂點的邊緣(此頂點的DFS已開始但尚未完成),這意味着它仍在遞歸堆棧中。

因此,如果按照有向圖中的方式定義后沿,則可以,它足以檢測周期。
但是,如果您將后緣的定義定義為無向圖中,那么您還需要確保v在遞歸堆棧中以檢測循環。

這個這個以獲取更多信息和示例。

例:
考慮DFS訪問順序為A -> B -> C
在此示例中,邊<A,C>是帶下划線的圖中的后邊(因為C已被訪問)。
但這不是該有向圖的后邊緣-C已被訪問但不在遞歸堆棧中,這意味着它不是循環。 在此處輸入圖片說明

當它是交叉邊緣而不是后邊緣時,需要進行第二次測試。 交叉邊緣是指從一個頂點到一個已經訪問過的頂點的一個邊緣,與位置無關。 后邊緣指的是指向起始頂點的祖先的一條邊,該頂點仍在遞歸堆棧中。 就如何提出問題而言,OP將后邊緣稱為指向另一個已經訪問過的邊緣的邊緣,但是更准確的解釋是交叉邊緣。 知道它是后邊緣就足夠了,因為這意味着第二步。 當第一個是交叉邊緣時,需要執行這些步驟,因為第二個步驟證明了交叉邊緣是后邊緣。 在有向圖中,交叉邊緣並不總是意味着發生循環。 這是一個例子:

vertices a,b,c,d
a->b
a->c
b->d
d->c

根據處理順序,可以將d->c視為交叉邊緣,因此需要步驟2來檢測循環。 不幸的是,后邊緣和交叉邊緣經常混合在一起,從而引起混亂。 這是指向兩者之間差異的另一描述的鏈接,即深度優先搜索

暫無
暫無

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

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