時間複雜度 o(n+m)
dfs 求解。
定義 dfn[n]為n當前的時間戳,low[n]為n最早能追溯到的時間戳,可知
1若回溯時 dfn[n]==low[n],即找到了乙個強連通分量。如圖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 }
注意乙個點也會被看做強連通分量。
若有環套環的情況,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中,如果任意兩個頂點都是連通的 所謂連通就是兩個頂點都能互相到達 那麼這個圖就是強連通圖。非強連通圖的極大強連通子圖,被稱為強連通分量。那麼什麼是極大強連通子圖呢?舉個例子幫助理解一下 例如下面圖一所示,其中子圖就是乙個極大強連通子圖,子圖也是乙個極大強...