基於DFS的求割點算法

基於DFS的求割點算法:

筆記;

圖的雙連通性:就是圖中不存在割點的圖

雙連通性的作用:具有雙連通性的網絡,不會因爲一個局域網癱瘓,而導致網絡全部癱瘓;因爲,每個點與點的聯繫在雙連通圖中不是唯一的,就是說去掉一個點這個同不會變成兩個不關聯的點集


實現思路:

**對每一個點都都進行測試,當刪除這個點和這個點的相關邊,DFS搜索能否一次遍歷完所有點,如果可以,則這個點不是割點;如果不可以,則這個點是割點

這個方法實現起來,其實很簡單,維護一張鄰接矩陣;然後在刪除點和相關邊後,執行DFS算法,判斷,即可


**另一種思路是:

設:這張圖是連通的

準備工作:求出這張圖的鄰接表,求出這張圖的邊集,點集

實現過程:

“”按照DFS搜索遍歷一次圖,將遍歷序列編號(按從小到大的順序,即根爲1),將遍歷走過的邊集記錄,稱爲樹邊集

**將樹邊集的反向邊集求出,稱爲反樹邊集

**將圖的邊集減去樹邊集,反樹邊集,得到一個背邊集

**





**以v1爲起點,執行深搜,得到序列:num(x)={1,2,3,4,5,6,7 }

邊集={{1,2},{1,3},{2,1},{2,3},{3,1},{3,2},{3,4},{4,3},{4,5},{4,6},{4,7},{5,4},{6,4},{6,7},{7,4},{7,6}}

點集={1,2,3,4,5,6,7}

樹邊集={{1,2},{2,3},{3,4},{4,5},{4,6},{6,7}}

反樹邊集={{2,1},{3,2},{4,3},{5,4},{6,4},{7,6}}

邊集-樹邊集-反樹邊集={{1,3},{3,1},{4,7},{7,4}}

背邊集=形如{u,w}且num(w)>num(u)={{3,1},{7,4}}

找出背邊集的作用是爲了找出每個點的最小背邊(由於圖的原因,並沒有多條背邊的比較)

取出一條背邊{u,w},維護一個low(x)數組,初始值都爲自己本身

若num(w)<num(x)<=num(u),則將w賦值給low的x位置,得到low(x)={1,1,1,4,5,4,4}


**在深度遍歷樹中,割點有兩個性質:

*割點當且僅當它有多餘一個的兒子,那麼它就是割點

*對於除去根的其它任何點u,當且僅當他有某個兒子w使得num(u)<=low(w),那麼它就是割點


所以,v1:只有一個兒子,所以不是割點

v2 :num(2)>low(3),不是割點

v3:num(3)< low(4),是割點

v4:num(4)<low(5),是割點

v5:沒有兒子節點,不是割點

v6:num(6)>low(7),不是割點

v7:沒有兒子節點,不是割點


因此,割點只有v3,v4

到此,算法結束...




其實,DFS還可以判斷一個圖是否是強連通圖,如果不是必定存在某個點或某些點爲起點的深搜無法一次完成


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章