無向圖求橋的幾種方法(無重邊)

目錄

前言:

法一:計算連通分量的基準法

描述:

時間複雜度分析:

數據:

法二:找結點基準法

描述:

時間複雜度分析:

數據:

法三:並查集

描述:

按秩合併:

路徑壓縮:

時間複雜度分析:

數據:

法四:生成樹篩邊基準法

描述:

時間複雜度分析:

數據:

法五:生成樹篩邊並查集

描述:

時間複雜度分析:

數據:

法六、Tarjan算法

描述:

實現細節:

舉例:

時間複雜度分析:

數據:


前言:

一圖中求橋的方法有很多種,以下介紹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²),但仍然是比前面所提過的所有算法快

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