天天看點

判斷一個圖是否有環無向圖有向圖

無向圖

方法一:

如果存在回路,則必存在一個子圖,是一個環路。環路中所有頂點的度>=2。    

第一步:删除所有度<=1的頂點及相關的邊,并将另外與這些邊相關的其它頂點的度減一。  

第二步:将度數變為1的頂點排入隊列,并從該隊列中取出一個頂點重複步驟一。  

如果最後還有未删除頂點,則存在環,否則沒有環。  

(實作代碼以後補充)

方法二:

深度優先周遊該圖,如果在周遊的過程中,發現某個節點有一條邊指向已經通路過的節點,并且這個已通路過的節點不是目前節點的父節點(這裡的父節點表示dfs周遊順序中的父節點),則表示存在環。

有向圖

拓撲排序,如果能夠用拓撲排序完成對圖中所有節點的排序的話,就說明這個圖中沒有環,而如果不能完成,則說明有環。

強連通子圖:對于一個圖的某個子圖,該子圖中的任意u->v,必有v->u,則這是一個強連通子圖。

通過尋找圖的強連通子圖的方法可以找出一個圖中到底有沒有環、有幾個環。

方法三:

改進DFS

    圖中的一個節點,根據其C[N]的值,有三種狀态:

    0,此節點沒有被通路過

    -1,被通路過至少1次,其後代節點正在被通路中

    1,其後代節點都被通路過。

    按照這樣的假設,當按照DFS進行搜尋時,碰到一個節點時有三種可能:

    1、如果C[V]=0,這是一個新的節點,不做處理

    2、如果C[V]=-1,說明是在通路該節點的後代的過程中通路到該節點本身,則圖中有環。

    3、如果C[V]=1,類似于2的推導,沒有環。    在程式中加上一些特殊的處理,即可以找出圖中有幾個環,并記錄每個環的路徑

繼續閱讀