首页 > 编程语言 > 详细

tarjan 算法求强连通分量

时间:2017-10-27 20:23:15      阅读:261      评论:0      收藏:0      [点我收藏+]
技术分享
 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 算法求强连通分量

原文:http://www.cnblogs.com/CJLHY/p/7744907.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!