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