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

图的强连通分量-Kosaraju算法

时间:2016-08-28 13:57:31      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

输入一个有向图,计算每个节点所在强连通分量的编号,输出强连通分量的个数

 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 using namespace std;
 5 const int maxn=1024;
 6 struct Edge{
 7     int go,next;
 8 };
 9 int vis[maxn],count=0,book[maxn];
10 vector<Edge> G,G2;
11 vector<int> S;
12 int end[maxn],end2[maxn];
13 void add(int from,int to){Edge e;e.go=to;e.next=end[from];G.push_back(e);end[from]=G.size()-1;}
14 void add2(int from,int to){Edge e;e.go=to;e.next=end2[from];G2.push_back(e);end2[from]=G2.size()-1;}
15 void dfs(int u)
16 {
17     vis[u]=1;
18     for(int i=end[u];i;i=G[i].next){
19         int go=G[i].go;
20         if(!vis[go]) dfs(go);
21     }
22     S.push_back(u);
23 }
24 void dfs2(int u)
25 {
26     book[u]=count;
27     for(int i=end2[u];i;i=G2[i].next){
28         int go=G2[i].go;
29         if(!book[go]) dfs2(go);
30     }
31 }
32 void init()
33 {
34     memset(vis,0,sizeof(vis));
35     memset(end,0,sizeof(end));
36     memset(end2,0,sizeof(end2));
37     memset(book,0,sizeof(book));
38 }
39 int main()
40 {
41     int n,m,a,b;
42     scanf("%d %d",&n,&m);
43     init();
44     for(int i=1;i<=m;i++)
45     {
46         scanf("%d %d",&a,&b);
47         add(a,b);
48         add2(b,a);
49     }
50     for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);
51     for(int i=n-1;i>=0;i--) if(!book[S[i]]){
52         count++;
53         dfs2(S[i]);
54     }
55     cout<<count;
56     return 0;
57 }

 

图的强连通分量-Kosaraju算法

标签:

原文地址:http://www.cnblogs.com/gzhonghui/p/5814806.html

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