题目:每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
牛被所有的牛认为是受欢迎的。
缩点之后如果只有一个点出度为0就输出个数,有多个的话就输出0。
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
inline char tc(void)
{
static char fl[10000],*A=fl,*B=fl;
return A==B?B=(A=fl)+fread(fl,1,10000,stdin),A==B?EOF:*A++:*A++;
}
inline void read(int &a)
{
a=0;static char c;
while((c=tc())<'0'||c>'9');
while(c>='0'&&c<='9')
a=a*10+c-'0',c=tc();
return ;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
int n,m,belong[10001],x,y,pre[10001],lowlink[10001],e[10001],hav[10001],cnt,clock,ans=0;
vector<int> edge[10001];stack<int> S;
void dfs(int u)
{
pre[u]=lowlink[u]=++clock;
S.push(u);
for (int i=0;i<edge[u].size();++i)
if(!pre[edge[u][i]])
{
dfs(edge[u][i]);
lowlink[u]=min(lowlink[u],lowlink[edge[u][i]]);
}
else
if(!belong[edge[u][i]])
{
lowlink[u]=min(lowlink[u],lowlink[edge[u][i]]);
}
if(lowlink[u]==pre[u])
{
++cnt;
while(1)
{
int x=S.top();S.pop();
belong[x]=cnt,++hav[cnt];
if(x==u)
break;
}
}
return ;
}
int main(void)
{
register int i,j;
read(n),read(m);
for (i=1;i<=m;++i)
read(x),read(y),edge[x].push_back(y);
for (i=1;i<=n;++i)
if(!pre[i])
dfs(i);
for (i=1;i<=n;++i)
if(!e[belong[i]])
{
for (j=0;j<edge[i].size();++j)
if(belong[i]!=belong[edge[i][j]])
{
e[belong[i]]=1;
break;
}
}
for (i=1;i<=cnt;++i)
if(!e[i])
{
if(ans)
{
puts("0");
return 0;
}
else
ans=hav[i];
}
printf("%d",ans);
return 0;
}