tarjan演算法是根據棧和dfs來實現。每個點有2個資料:dfn和low
結點1的dfn為1,low也為1,然後dfs到3,3的dfn為2,low為2,每次訪問乙個就dfn++,當訪問的時候時是棧中結點時,就將low變為那個棧中結點的dfn,這樣可以保證low與dfn不相同。如果訪問不到棧中的結點,就會dfn和low相等。例如5,6.出棧的條件就是不能繼續向後訪問並且dfn=low。
5,6都出棧,到3的時候訪問4,4先將dfn和low是5,然後到4,能夠訪問1(棧中元素),就將low改為1,當然,如果可以,先選擇訪問不在棧中結點,6已經被標記出棧,所以不再訪問,4訪問1完後,此時棧中有1,3,4.然後2進棧,dfn和low為6,能夠訪問4,所以將low變為5.所有元素都遍歷了一遍,6是乙個強連通分量,5也是,1,2,3,4是乙個強連通分量。
模板:#include//此**僅供參考,用於求乙個圖存在多少個強連通分量
#include
#include
#include
using namespace std;
#define maxn 1000000
vectormp[maxn];
int ans[maxn];
int vis[maxn];
int dfn[maxn];
int low[maxn];
int n,m,tt,cnt,sig;
void init()
void tarjan(int u)
{vis[u]=1;
low[u]=dfn[u]=cnt++;
for(int i=0;i
Tarjan演算法 模板
只是下一下模板,如果還是沒有懂得原理的,可以看一下這位大牛的部落格 include include include include using namespace std const int maxn 1100 struct node edge maxn int head maxn int dfn ...
Tarjan演算法模板
一 tarjan有向圖的強連通 tarjan const int maxn 200100 const int maxm 500100 struct edgeedge maxm int head maxn tot int low maxn dfn maxn stack maxn belong maxn...
Tarjan演算法 模板
演算法思想 首先要明確強連通圖的概念,乙個有向圖中,任意兩個點互相可以到達 什麼是強連通分量?有向圖的極大連通子圖叫強連通分量。給乙個有向圖,我們用tarjan演算法把這個圖的子圖 在這個子圖內,任意兩個點可以相互到達,極大的子圖 縮成乙個點,相當於化簡 怎樣去做 從乙個點開始遍歷它能走到的下乙個點...