首页 > 代码库 > 求有向图的强连通分量个数 之 Kosaraju算法

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

代码:

 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int maps[1100][1100],nmap[1100][1100]; 6 int vis[1001]; 7 int ans=0,aaa=0,n,m,post[1100]; 8 void dfs(int); 9 void ndfs(int);10 int main()11 {12     scanf("%d%d",&n,&m);13     for(int i=1;i<=m;i++){14     int x,y;15     scanf("%d%d",&x,&y);16     maps[x][y]=1;17     nmap[y][x]=1;18     }19     for(int i=1;i<=n;i++)20     {21         if(vis[i]==0)22         dfs(i);23     }24     for(int i=n;i>=1;i--)25     {26         if(vis[post[i]]==1)27         {28             ndfs(post[i]);29             ans++;30         }31     }32     cout<<ans;33 }34 void ndfs(int x)35 {36     vis[x]=0;37     for(int i=1;i<=n;i++)38     {39         if(vis[i]&&nmap[x][i]==1)40         ndfs(i);41     }42 }43 void dfs(int x)44 {45     vis[x]=1;46     for(int i=1;i<=n;i++)47     {48         if(!vis[i]&&maps[x][i]==1){49             dfs(i);50         }51     }52     aaa++;53     post[aaa]=x;54 }

 

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