判断图有无环_【转】判断一个图是否有环 无向图 有向图
無向圖:
法1:
如果存在回路,則必存在一個子圖,是一個環路。環路中所有頂點的度>=2。
n算法:
第一步:刪除所有度<=1的頂點及相關的邊,并將另外與這些邊相關的其它頂點的度減一。
第二步:將度數變為1的頂點排入隊列,并從該隊列中取出一個頂點重復步驟一。
如果最后還有未刪除頂點,則存在環,否則沒有環。
n算法分析:
由于有m條邊,n個頂點。如果m>=n,則根據圖論知識可直接判斷存在環路。
(證明:如果沒有環路,則該圖必然是k棵樹?k>=1。根據樹的性質,邊的數目m?=?n-k。k>=1,所以:m
如果m
另:
該方法,算法復雜度不止O(V),首先初始時刻統計所有頂點的度的時候,復雜度為(V + E),即使在后來的循環中E>=V,這樣算法的復雜度也只能為O(V + E)。其次,在每次循環時,刪除度為1的頂點,那么就必須將與這個頂點相連的點的度減一,并且執行delete node from list[list[node]],這里查找的復雜度為list[list[node]]的長度,只有這樣才能保證當degree[i]=1時,list[i]里面只有一個點。這樣最差的復雜度就為O(EV)了。
法2:
DFS搜索圖,圖中的邊只可能是樹邊或反向邊,一旦發現反向邊,則表明存在環。該算法的復雜度為O(V)。
有向圖:
主要有深度優先和拓撲排序2中方法
1、拓撲排序,如果能夠用拓撲排序完成對圖中所有節點的排序的話,就說明這個圖中沒有環,而如果不能完成,則說明有環。
2、可以用Strongly Connected Components來做,我們可以回憶一下強連通子圖的概念,就是說對于一個圖的某個子圖,該子圖中的任意u->v,必有v->u,則這是一個強連通子圖。這個限定正好是環的概念。所以我想,通過尋找圖的強連通子圖的方法應該可以找出一個圖中到底有沒有環、有幾個環。
3、就是用一個改進的DFS
剛看到這個問題的時候,我想單純用DFS就可以解決問題了。但細想一下,是不能夠的。如果題目給出的是一個無向圖,那么OK,DFS是可以解決的。但無向圖得不出正確結果的。比如:A->B,A->C->B,我們用DFS來處理這個圖,我們會得出它有環,但其實沒有。
我們可以對DFS稍加變化,來解決這個問題。解決的方法如下:
圖中的一個節點,根據其C[N]的值,有三種狀態:
0,此節點沒有被訪問過
-1,被訪問過至少1次,其后代節點正在被訪問中
1,其后代節點都被訪問過。
按照這樣的假設,當按照DFS進行搜索時,碰到一個節點時有三種可能:
1、如果C[V]=0,這是一個新的節點,不做處理
2、如果C[V]=-1,說明是在訪問該節點的后代的過程中訪問到該節點本身,則圖中有環。
3、如果C[V]=1,類似于2的推導,沒有環。??? 在程序中加上一些特殊的處理,即可以找出圖中有幾個環,并記錄每個環的路徑
總結
以上是生活随笔為你收集整理的判断图有无环_【转】判断一个图是否有环 无向图 有向图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推理计算过程_初中物理电学计算题第六讲:
- 下一篇: 哈利·波特手机未发先火 Redmi出过的