無向圖
方法一:
如果存在回路,則必存在一個子圖,是一個環路。環路中所有頂點的度>=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的推導,沒有環。 在程式中加上一些特殊的處理,即可以找出圖中有幾個環,并記錄每個環的路徑