tarjan 算法求強連通分量
阿新 • • 發佈:2017-10-27
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));View Code13 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 } 25if(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 }
tarjan 算法求強連通分量