174. 受欢迎的牛_编程题目
174. 受欢迎的牛_编程题目_02

当一头牛的出度为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;
}