poj 3180 求有多少个强联通分量

来源:互联网 发布:python cookielib模块 编辑:程序博客网 时间:2024/04/28 15:34
#include<cstdio>//挑战上的模版#include<cstring>#include<vector>#define MAX_N 10010using namespace std;vector<int>G[MAX_N];vector<int>rG[MAX_N];vector<int>vs;bool vis[MAX_N];int cmp[MAX_N];int V,ans,bol;void add_edge(int from,int to){G[from].push_back(to);rG[to].push_back(from);} void dfs(int v){vis[v]=1;for(int i=0;i<G[v].size();i++){if(!vis[G[v][i]])dfs(G[v][i]);}vs.push_back(v);}void rdfs(int v,int k,int step){vis[v]=1;cmp[v]=k;bol=step; for(int i=0;i<rG[v].size();i++){if(!vis[rG[v][i]])rdfs(rG[v][i],k,step+1);}}int scc(){memset(vis,0,sizeof(vis));vs.clear();for(int v=1;v<=V;v++){if(!vis[v])dfs(v);}memset(vis,0,sizeof(vis));int k=1;for(int i=vs.size()-1;i>=0;i--){bol=0;if(!vis[vs[i]])rdfs(vs[i],k++,1);if(bol>1)ans++;}return k;}int main(){int n,m,a,b;int count[MAX_N];memset(count,0,sizeof(count)); scanf("%d%d",&n,&m);V=n;for(int i=0;i<m;i++){scanf("%d%d",&a,&b);add_edge(a,b);}ans=0;scc();printf("%d\n",ans);return 0;   }

0 0
原创粉丝点击