当前位置: 代码迷 >> 综合 >> POJ 2186 Popular Cows Korasaju .
  详细解决方案

POJ 2186 Popular Cows Korasaju .

热度:104   发布时间:2023-09-23 07:56:09.0

题目地址: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;
}