1. 程式人生 > >圖論練習-有向圖的強連通分量【tarjan】

圖論練習-有向圖的強連通分量【tarjan】

這周剛剛看了圖論的一些東西,感覺自己理解比較費勁,所以這裡小小總結一下,如果有誤,歡迎指出

好了,現在我們來看一下圖論的一些基礎的概念:
有向圖強連通分量:在有向圖G中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。

那麼在這個有向圖中,我們怎麼去求一個強連通分量呢?
這裡呢,就介紹一下tarjan演算法
我們對於任意一個有向圖進行dfs, 得到搜尋樹,而很顯然,對於一個強連通分量來說,它一定是有某個深度優先搜尋樹上的生成樹。因此,當我們搜尋的時候沿路儲存每一個點,當有環形成的時候,這就將成為一個強連通,我們只要找到最大的那個環,那麼就是我們要找的強連通分量,那麼怎麼樣去找到最大的那個環呢?

首先我們先將所有訪問過的點都放入棧中,並且標記他們每個點初始被訪問到的時間或者認為是每個點按BFS的順序給一個序號放在dfn[i]陣列中,當遇到環的時候,我們將該條路徑中所有點的祖先都記錄為這個路徑中最小的序號low[i]中,當然一個強連通分量是由很多個環組成的,但這些環內的點因為彼此可以到達,所以一定可以找到一個最小的祖先,那麼我們只要發現dfn[i]=low[i]的時候,i就是最早出現的那個強連通分量中的點,此時,我們把從i 到棧頂的所有元素都出棧,他們就是我們要求的一個強連通分量…