POJ 2186 Popular Cows Korasaju .

来源:互联网 发布:java md5 32加密算法 编辑:程序博客网 时间:2024/05/17 02:26

题目地址:http://poj.org/problem?id=2186

结论:有向无环图中唯一出度为0的点,一定可以由任何点出发均可达(由于无环,所以从任何点出发往前走,必然终止于一个出度为0的点)

所以就找找出度为0的点有几个就好了

#include<iostream>#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;const int maxn=10000+10;bool vis[maxn];int ID[maxn]; int ncolor;vector<int> s;vector<vector<int> > color(maxn); vector<vector<int> > G(maxn);vector<vector<int> > GT(maxn);void dfs(int u){vis[u]=true;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(!vis[v]) dfs(v);}s.push_back(u);}void dfs2(int u){vis[u]=true;ID[u]=ncolor;color[ncolor].push_back(u);for(int i=0;i<GT[u].size();i++){int v=GT[u][i];if(!vis[v]) dfs2(v);}}void Korasaju(int n){memset(vis,false,sizeof(vis));s.clear();for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);memset(vis,false,sizeof(vis));ncolor=0;for(int i=s.size()-1;i>=0;i--) {int j=s[i];if(!vis[j]) ncolor++,dfs2(j);}}int solve(int n) //找出度为0的{int m=0,ans; //m标记出度为0的点有几个 for(int i=1;i<=ncolor;i++){bool ok=true;for(int j=0;j<color[i].size()&&ok;j++){int u=color[i][j];for(int k=0;k<G[u].size()&&ok;k++){int v=G[u][k];if(ID[u]!=ID[v])  //有出度 ok=false; }}if(ok) m++,ans=i;if(m>1) break;}if(m!=1) return 0;else return color[ans].size();} int main(){int n,m;cin>>n>>m;while(m--){int u,v;cin>>u>>v;G[u].push_back(v);GT[v].push_back(u);  //转置图 }Korasaju(n);cout<<solve(n);return 0;} 



0 0