強連通分量 tarjan演算法模板詳解

2021-06-18 16:47:19 字數 829 閱讀 2359

對於基本的演算法過程在這裡推薦一位大牛的分析:有向圖強連通分量的tarjan演算法

分析中結合圖形模擬演算法過程,我也是看了這位大牛的文章之後入門tarjan演算法,但是大牛的**中沒有注釋,自己比較笨,看大牛的**也用了很長時間理解,這裡給出大牛的**模板結合自己的詳細解釋,希望以後自己來看一目了然,也希望能幫助剛接觸tarjan演算法的人更快理解

下面是大牛的**(一些變數名有改動,希望更有助理解)

int top;//這個是用作棧頂的指標

int stack[max];//維護的乙個棧

bool instack[max];//instack[i]為真表示i在棧中

int dfn[max],low[max];

int belong[max];//belong[i] = a; 表示i這個點屬於第a個連通分量

int bcnt,dindex;//bcnt用來記錄連通分量的個數,dindex表示到達某個點的時間

void tarjan(int u)

else if (instack[v] && dfn[v] < low[u])

low[u] = dfn[v];

}if (dfn[u] == low[u])//這裡表示找完乙個強連通啦

while (u != v);//一直到v=u都是屬於第bcnt個強連通分量

}}void solve()

如果對模板也比較熟悉就試著做 hdu1269迷宮城堡---就是判斷給出的圖是否為乙個強連通,簡單的模板題

個人愚昧觀點,歡迎指正與討論

強連通分量Tarjan演算法

o v e 通常的tarjan寫法是有個dfn陣列跟乙個instack陣列,我精簡了下 把這兩個陣列都刪去了,用更簡便的寫法代替,也省了空間。int low maxn 記錄這棵樹能到達的最早祖先 其實不一定是最早,但不影響使用 int time 時間戳 int num 連通分量的個數 int bel...

強連通分量 tarjan演算法

強連通分量 tarjan演算法 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected com...

強連通分量 Tarjan演算法

有向圖強連通分量 在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通。如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。tarjan 演算法是基於對圖優先搜素的演算法 每...