图的强连通分量-Kosaraju算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的强连通分量-Kosaraju算法相关的知识,希望对你有一定的参考价值。

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

 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算法的主要内容,如果未能解决你的问题,请参考以下文章

请问如何求(有向/无向)图的强连通分量,还有,基础一点,怎么求有几个连通图啊

图的连通性算法

求有向图的强连通分量个数 之 Kosaraju算法

Algorithms IV求解强连通分量 Kosaraju算法

Kosaraju 算法

连通图算法详解之① :Tarjan 和 Kosaraju 算法