牛客上的题:
    https://ac.nowcoder.com/acm/contest/15401/A

    dfs代码:
    #include
    using namespace std;
    const int N = 1e5+5;
    vector v[N];
    int ans;
    int out[N],in[N];
    int jy[N];//记忆数组
    int dfs(int x)
    {
    if(v[x].size()==0)
    {
    return jy[x]=1;
    }
    int dd = 0;
    for (int i=0;i {
    if(jy[v[x][i]])
    dd+=jy[v[x][i]];
    else
    {
    jy[v[x][i]]=dfs(v[x][i]);
    dd+=jy[v[x][i]];
    }
    }
    return dd;
    }
    int main ()
    {
    int n,m;
    scanf(“%d%d”,&n,&m);
    for (int i=1;i<=m;i++)
    {
    int a,b;
    scanf(“%d%d”,&a,&b);
    in[b]++,out[a]++;
    v[a].push_back(b);
    }
    for (int i=1;i<=n;i++)
    {
    if(in[i]==0&&out[i])
    ans+=dfs(i);
    }
    cout< return 0;
    }

    bfs代码:
    #include
    using namespace std;
    const int N=1e6+5;

    int h[N],e[N],ne[N],idx;
    int n,m;
    int rd[N],cd[N];
    int ans=0;
    queueq;
    int cnt[N];

    void add(int a,int b)//处理邻接表
    {

    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
    }

    int main()
    {
    scanf(“%d%d”,&n,&m);
    memset(h,-1,sizeof h);
    while(m—)
    {
    int a,b;
    scanf(“%d%d”,&a,&b);
    add(a,b);
    rd[b]++;
    cd[a]++;
    }

    for(int i=1;i<=n;i++)
    {
    if(!rd[i])
    {
    cnt[i]=1;
    q.push(i);
    }
    }

    while(!q.empty())
    {
    int tem=q.front();
    //cout< q.pop();
    for(int i=h[tem];i!=-1;i=ne[i])
    {


    int tt=e[i];
    cnt[tt]=cnt[tt]+cnt[tem];//入度数加起来


    if(!(—rd[tt])) //剩下最后一个入度边,判断是否出度为0的结点
    {
    if(cd[tt])q.push(tt);
    else ans+=cnt[tt];
    }
    }
    }
    cout< return 0;
    }