tarjan 算法求强连通分量
Posted notnight
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tarjan 算法求强连通分量相关的知识,希望对你有一定的参考价值。
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 }
以上是关于tarjan 算法求强连通分量的主要内容,如果未能解决你的问题,请参考以下文章