#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
struct node{
int s,e;
}arr[50010];
vector<int> mat[10020];
vector<int> tmat[10020];
int n,m;
int vis[15000];
int mark[15000];
int cnt[15000];
int du[15000];
stack<int >q;
int num=0;
void dfs(int start)
{
vis[start]=1;
for(int i=0;i<mat[start].size();i++)
{
if(!vis[mat[start][i]])
{
dfs(mat[start][i]);
}
}
q.push(start);
return;
}
void dfsop(int start)
{
vis[start]=1;
mark[start]=num;
cnt[num]++;
for(int i=0;i<tmat[start].size();i++)
{
if(!vis[tmat[start][i]])
{
dfsop(tmat[start][i]);
}
}
}
int main()
{
cin>>n>>m;
node c;
//int cnt=0;
for(int i=1;i<=m;i++)
{
int s,e;
cin>>s>>e;
mat[s].push_back(e);
tmat[e].push_back(s);
c.s=s;
c.e=e;
arr[i]=c;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
dfs(i);
}
}
memset(vis,0,sizeof(vis));
while(!q.empty())
{
if(vis[q.top()]) {q.pop();continue;}
++num;
dfsop(q.top());
q.pop();
}
for(int i=1;i<=m;i++)
{
int s=arr[i].s,e=arr[i].e;
if(mark[s]!=mark[e])
{
du[mark[s]]++;
}
}
// int judge=1;
//for(int i=1;i<=n;i++) cout<<mark[i]<<' ';
//cout<<endl;
//for(int i=1;i<=n;i++) cout<<du[i]<<' ';
//cout<<endl;
int sum=0;
int ppp=0;
for(int j=num;j>=1;j--)
{
if(du[j]==0) sum++;
}
for(int j=num;j>=1;j--)
{
if(du[j]==0) ppp=j;
}
if(sum==1)
cout<<cnt[ppp]<<endl;
else cout<<0<<endl;
return 0;
}
poj2186 Popular Cows
最新推荐文章于 2017-10-02 11:24:42 发布