求大佬指点
查看原帖
求大佬指点
103990
asd_a楼主2018/6/14 11:21
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int to[N],ne[N],fi[N],tot,n,m,id[N],num[N],top,st[N],in[N],l[N],d[N],du[N],sum,cnt;
inline void ad(int x,int y)
{
    to[++tot]=y;
    ne[tot]=fi[x];
    fi[x]=tot;
    return ;
}
inline void dfs(int x,int fa)
{
    l[x]=d[x]=++cnt;
    st[++top]=x;
    in[x]=1;
    for(int i=fi[x];i;i=ne[i])
    {
        int y=to[i];
        if(y && y!=fa)
        {
            if(!d[y])
            {
                dfs(y,x);
                l[x]=min(l[x],l[y]);
            }
            else if(in[y])
            {
                l[x]=min(l[x],d[y]);
            }
        }
    }
    if(l[x]==d[x])
    {
        sum++;
        while(st[top]!=x)
        {
            in[st[top]]=0;
            id[st[top]]=sum;
            num[sum]++;
            st[top]=0;
            top--;
        }
        in[st[top]]=0;
        id[st[top]]=sum;
        num[sum]++;
        st[top]=0;
        top--;
    }
}
int main()
{
    cin>>n>>m;
    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        ad(x,y);
    }
    for(int i=1;i<=n;i++)
    {
        if(!d[i])
            dfs(i,0);
    }
    for(int i=1;i<=n;i++)
        for(int j=fi[i];j;j=ne[j])
            if(id[to[j]]!=id[i])
                du[id[i]]++;
    int ans=0,fl=0;
    for(int i=1;i<=sum;i++)
    {
        if(!du[i])
        {
            if(fl)
            {
                cout<<0<<endl;
                return 0;
            }
            else
            {
                ans=num[i];
                fl=1;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

WA了第2和8 个点

2018/6/14 11:21
加载中...