目錄
前言:
一圖中求橋的方法有很多種,以下介紹6種求橋的方法
有一個結論:當圖的連通子圖的個數 ≥ 2的時候,鄰接表一定比矩陣快
舉例:假設一個圖有10000個結點,其中的一個連通子圖只有3個結點2條邊,那麼在判斷這個結點上的2條邊是否爲橋的時候,鄰接表只需要2次即可找到這2條邊,而矩陣需要2*10000次纔可以找到這2條邊
所以後文中圖的存儲結構都是採用的鄰接表,不會混用鄰接表和鄰接矩陣
法一:計算連通分量的基準法
描述:
假設邊e連接着2個頂點v1和v2
對全圖做DFS計算出連通子圖個數k1
刪掉邊e
再對全圖做DFS計算出連通子圖個數k2
若k2<k1則邊e爲橋
時間複雜度分析:
對全圖做DFS需要O(n+e)
有e條邊
需要對全圖做e次DFS,總時間爲O(en+e²)
稀疏圖:O(n²)
稠密圖:O(n^4)
數據:
圖1、計算連通分量基準法數據
可以看出此方法的速度是非常慢的
法二:找結點基準法
描述:
假設邊e連接着2個頂點v1和v2,刪掉邊e,對頂點v1進行DFS
如果v2在v1的DFS中,則邊e不是橋
如果v2不在v1的DFS中,則邊e是橋
時間複雜度分析:
假設圖有n個頂點,e條邊
需要做e次DFS
每次DFS時間爲O(e)
總時間爲:O(e²)
稀疏圖:O(n²)
稠密圖:O(n^4)
數據:
圖2、找結點基準法的稀疏圖數據
由圖2可以知道,在稀疏圖中,找結點基準法比計算連通分量的基準法快很多
圖3、找結點基準法的稠密圖數據
由圖3可以知道,在稠密圖中,找結點基準法比計算連通分量的基準法快很多
因此,找結點基準法是一種比計算連通分量基準法更優秀的算法
法三:並查集
描述:
假設邊e連接着2個頂點v1和v2
刪掉邊e
刷新圖的各結點的集合
若v1和v2在同一個集合中,則邊e不爲橋
若v1和v2不在同一個集合中,則邊e爲橋
按秩合併:
在集合的合併中,將小集合合併到大集合中
路徑壓縮:
在Union操作中,由於大部分新加入的結點都是加在集合樹的葉子上,所以會導致集合樹的深度過大,那麼可以在Find操作中,將葉子結點人工地指向根結點,這樣就可以降低樹的高度,提高find的效率
時間複雜度分析:
假設圖有n個頂點,e條邊
初始化需要n次MAKE-SET操作
判斷每條邊需要做2次FIND-SET操作,判斷圖共2e次FIND-SET操作
每個頂點需要做一次UNION操作,判斷圖共n次UNION操作
由書上定理21.14,最壞需要O((n+2e+n)α(n))取O ((n+2e+n))
所以更新一次集合的時間爲O ((n+2e+n))
由於有e條邊,需要更新e次集合,所以總時間爲:O ((2ne+2e²))
稀疏圖:O(n²)
稠密圖:O(n^4)
數據:
圖4、並查集的稀疏圖數據
由圖可以得出稀疏圖中並查集的增長仍是符合O(n²)的,而且速度比計算連通分量的基準法快,但比找結點基準法慢
法四:生成樹篩邊基準法
描述:
在做基準法之前,先用DFS掃出生成樹,只對生成樹上的邊做基準法
時間複雜度分析:
數據:
稀疏圖:
圖5、生成樹篩邊基準法的稀疏圖數據
由圖5可以得出:在邊數小於頂點數時,由於找到生成樹需要額外的時間,所以生成樹基準法比找點基準法慢
稠密圖:
圖6、生成樹篩邊基準法的稠密圖數據
由圖6可以看出:在邊數遠大於頂點數時,生成樹基準法所需要判斷是否爲橋的邊遠小於基準法中要判斷的邊,所以生成樹基準法快於基準法
法五:生成樹篩邊並查集
描述:
在做基準法之前,先用DFS掃出生成樹,只對生成樹上的邊做並查集
時間複雜度分析:
數據:
結點個數爲10000,邊數爲n時數據
圖7、生成樹篩邊並查集數據
由圖7可以得出:
某些邊數小的區間內,生成樹並查集慢於並查集
在邊數大的區間,生成樹並查集快於並查集,因爲邊數多的時候,生成樹並查集所需要判斷是否爲橋的邊遠小於並查集中要判斷的邊,所以生成樹並查集快於並查集
法六、Tarjan算法
描述:
從某個頂點開始進行DFS,並進行標號
如果某個結點的某條邊的DFS中有某個孩子有邊指向這個結點或這個結點的祖先,那麼這條邊爲橋
實現細節:
設置一個visit數組表示訪問的順序
設置一個low數組,low[i]表示結點i的孩子中指向的最早的祖先
low[v] = min { visit[v], low[w], visit[k] }
其中:w爲v的孩子結點
k爲v的祖先結點
若(v1,v2)是一條邊
low[v1]>visit[v2]的意義:
v1包括v1的子樹所連的最早的祖先在v2的子樹中
結論:
若low[v1]>visit[v2],則(v1,v2)必爲橋
舉例:
圖8、樣例圖
如圖8,我們要找到圖中所有的橋
圖9、計算visit數組和low數組的過程
如圖9,從結點0開始做DFS,結點左邊的數爲visit,右邊的數爲low,所得出visit的順序和low的順序由上圖的藍色箭頭所示
圖10、low大於visit的結點
如圖10,綠色箭頭所示的low都大於visit,所以所對應的邊都爲橋
時間複雜度分析:
鄰接表一次DFS的複雜度爲O(n+e)
稀疏圖:O(n)
稠密圖:O(n²)
數據:
圖11、Tarjan算法稀疏圖數據
由圖11可得:在稀疏圖中,Tarjan算法的增長符合O(n),而且它的速度超過了前面所提出的所有算法,時間複雜度達到線性
圖12、Tarjan算法稠密圖數據
由上圖可得:在稠密圖中,Tarjan算法的增長符合O(n²),但仍然是比前面所提過的所有算法快