《學習筆記》 tarjan 求強連通分量

2022-08-13 22:42:09 字數 1272 閱讀 1365

時間複雜度 o(n+m)

dfs 求解。

定義 dfn[n]為n當前的時間戳,low[n]為n最早能追溯到的時間戳,可知

1

for(int i=first[n];i;i=next[i])28

else

9if(instack[rode[i].t]) low[n]=min(low[n],dfn[rode[i].t]);

10 }

若回溯時 dfn[n]==low[n],即找到了乙個強連通分量。如圖

注意乙個點也會被看做強連通分量。

若有環套環的情況,tarjan求的是最大的那個。

另外判斷instack是為了避免這樣的情況。

防止不是環中元素的點被計入環。

#include#include

#include

#include

#include

#include

using

namespace

std;

intn,m,a,b,c,cnt,top,index,scc_cnt;

int first[100010],next[200010

];int dfn[100010],low[100010],instack[100010],stack[100010

];int belong_scc[100010

];vector

scc[100010

];struct

maplerode[

200010

];void build(int f,int t,intd);

next[cnt]=first[f];

first[f]=cnt;

}void tarjan(int

n)

else

if(instack[rode[i].t]) low[n]=min(low[n],dfn[rode[i].t]);

}if(dfn[n]==low[n]) //

是乙個環

while(j!=n);

}}int

main()

tarjan(1);

return0;

}

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

Tarjan求強連通分量

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

tarjan求強連通分量

tarjan求強連通分量 我們知道,在有向圖g中,如果任意兩個頂點都是連通的 所謂連通就是兩個頂點都能互相到達 那麼這個圖就是強連通圖。非強連通圖的極大強連通子圖,被稱為強連通分量。那麼什麼是極大強連通子圖呢?舉個例子幫助理解一下 例如下面圖一所示,其中子圖就是乙個極大強連通子圖,子圖也是乙個極大強...