1. 程式人生 > >tarjan 算法求強連通分量

tarjan 算法求強連通分量

n) 後繼節點 memset eof cnblogs hide open vector space

技術分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e4+5;
 4 int cmp[N],dfn[N],tot,n,m;// dfn為節點的時間戳
 5 bool vis[N];
 6 stack<int> st;
 7 vector<int> e[N];
 8 void init()
 9 {
10     memset(cmp,0,sizeof(cmp));
11     memset(vis,0,sizeof(vis));
12     memset(dfn,0,sizeof(dfn));
13 for(int i=1;i<=n;i++) e[i].clear(); 14 tot=1; 15 } 16 int tarjan(int v,int t) 17 { 18 st.push(v); dfn[v]=t; vis[v]=true; 19 int res=t; //res為後繼節點的最小時間戳 20 for(int i:e[v]) 21 { 22 if(vis[i]) res=min(res,dfn[i]); 23 else res=min(res,tarjan(i,t+1)); 24 } 25
if(res==t) 26 { 27 while(!st.empty()) 28 { 29 int cur=st.top(); st.pop(); 30 cmp[cur]=tot; 31 if(cur==v) break; 32 33 } 34 tot++; 35 } 36 return res; 37 } 38 int main() 39 { 40 while(~scanf("%d%d",&n,&m) && (n||m))
41 { 42 init(); 43 for(int i=1;i<=m;i++) 44 { 45 int f,t; scanf("%d%d",&f,&t); 46 e[f].push_back(t); 47 } 48 for(int i=1;i<=n;i++) if(!cmp[i]) tarjan(i,1); 49 } 50 return 0; 51 }
View Code

tarjan 算法求強連通分量