码迷,mamicode.com
首页 > 编程语言 > 详细

tarjan 算法求强连通分量

时间:2017-10-27 20:35:34      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:space   tarjan   gif   ons   opened   span   pen   const   mem   

技术分享
 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 算法求强连通分量

标签:space   tarjan   gif   ons   opened   span   pen   const   mem   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!