174. 受欢迎的牛
当一头牛的出度为0他一定是受欢迎的牛。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10010,M=50010;
int h[N],ne[M],e[M],idx;
int s[N],dfn[N],low[N],timestamp,cnt;
int Size[N],id[N];
bool is[N];
int n,m;
int top;
int dout[N];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void targan(int u)
{
dfn[u]=low[u]=++timestamp;
s[top++]=u,is[u]=true;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(!dfn[j])
{
targan(j);
low[u]=min(low[u],low[j]);
}
else if(is[j])
{
low[u]=min(low[u],dfn[j]);
}
}
if(low[u]==dfn[u])
{
int y;
cnt++;
do{
y=s[--top];
id[y]=cnt;
Size[cnt]++;
is[y]=false;
}while(y!=u);
}
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
targan(i);
for(int i=1;i<=n;i++)
for(int j=h[i];~j;j=ne[j])
{
int t=e[j];
if(id[i]!=id[t])
dout[id[i]]++;
}
long long sum=0;
int zeros=0;
for(int i=1;i<=cnt;i++)
if(!dout[i])
{
zeros++;
if(zeros>=2) {
sum=0;
break;
}
sum+=Size[i];
}
cout<<sum<<endl;
}