判断无向图是否有回路有四种方法
一、無向圖回路的判斷
? ? 對于無向圖,判斷其是否有回路有四種方法,如下所示:
? ? 1、利用深度優先搜索DFS,在搜索過程中判斷是否會出現后向邊(DFS中,連接頂點u到它的某一祖先頂點v的邊),即在DFS對頂點進行著色過程中,若出現所指向的頂點為黑色,則此頂點是一個已經遍歷過的頂點(祖先),出現了后向邊,若完成DFS后,則圖中有回路;
? ? 2、在圖的鄰接表表示中,首先統計每個頂點的度,然后重復尋找一個度為1的頂點,將度為1和0的頂點從圖中刪除,并將與該頂點相關聯的頂點的度減1,然后繼續反復尋找度為1的,在尋找過程中若出現若干頂點的度都為2 sanzhangpai,則這些頂點組成了一個回路;否則,圖中不存在回路。
? ? 3、利用BFS,在遍歷過程中,為每個節點標記一個深度deep,如果存在某個節點為v,除了其父節點u外,還存在與v相鄰的節點w使得deep[v]<=deep[w]的,那么該圖一定存在回路;
? ? 4、用BFS或DFS遍歷,最后判斷對于每一個連通分量當中,如果邊數m>=節點個數n,那么改圖一定存在回路。因此在DFS或BFS中,我們可以統計每一個連通分量的頂點數目n和邊數m,如果m>=n則return false;直到訪問完所有的節點,return true。
二、有向圖回路的判斷
? ? 對于有向圖,判斷其是否有回路的方法也有兩種,如下所示:
? ? 1、與無向圖類似,若在DFS中出現后向邊,即存在某一頂點被第二次訪問到,則有回路出現;
? ? 2、同樣,利用拓撲排序的思想,通過這一步驟來執行拓撲排序,即重復尋找一個入度為0的頂點,將該頂點從圖中刪除,并將該頂點及其所有的出邊從圖中刪除(即與該點相應的頂點的入度減1),最終若途中全為入度為1的點,則這些點至少組成一個回路。
? ? 對于有向圖,具體點就可得到如下分析:
? ? 問題分析:如果圖中存在回路,則必包含一個子圖為回路。即該子圖中所有頂點入度不為0且至少有邊指向另外的頂點。
? ? 算法:
? ? 步驟1:按鄰接表方式存儲圖。遍歷與每個節點關聯的邊并統計每個節點的入度。需要O(n+m)次的運算。
? ? 步驟2:刪除所有入度為零的頂點及其相發出的邊。并將被刪除邊所指向的頂點的入度減1。
? ? 重復步驟2直到:
? ? (1)所有頂點被刪除(則沒有回路)或;
? ? (2)還有頂頂點但沒有入度為零的頂點可刪除(則存在回路)。
? ? 算法復雜度分析:
? ? 由于步驟二中的刪除邊的操作運算復雜度為O(m),刪除節點的操作為O(n) 判斷節點入度是否為0需要O(n+m)次運算。其中O(n)次為初始入度為零的節點,O(m)次為刪除邊后導致的入度為零的節點。于是整個算法復雜度為O(m+n)。
WZ132 手機愛好者
- Android
- Symbian
- BlackBerry
- Palm
- iPhone IOS
- Linux
總結
以上是生活随笔為你收集整理的判断无向图是否有回路有四种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我就是不敢的openeim002
- 下一篇: 我写过最长的东西可能就是高考作文了