40分求助!
查看原帖
40分求助!
242490
lyc呐楼主2020/9/30 11:31
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

const int N = 5e3+10, M = 5e5+10, mod = 80112002;
int h[N], e[M], ne[M], idx;
int in[N], out[N], f[N]; //入度、出度、路径数 
int n, m, ans;

void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

void topsort()  //拓扑排序 
{
    queue<int> Q;
    for(int i = 1 ; i <= n ; i ++)
        if(!in[i])
            Q.push(i), f[i] = 1;

    while(!Q.empty())
    {
        int t = Q.front();
        Q.pop();

        for(int i = h[t] ; i != -1 ; i = ne[i])
        {
            int j = e[i];
            f[j] = f[j] + f[t] % mod;
            in[j] --;
            if(!in[j])
                Q.push(j);
        }
    }

    for(int i = 1 ; i <= n ; i ++)
        if(!out[i]) //所有出度为0的点是终点 
            ans = ans + f[i] % mod;
}

int main()
{
    cin >> n >> m;

    memset(h, -1, sizeof h);
    for(int i = 0 ; i < m ; i ++)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
        in[b] ++;
        out[a] ++;
    }

    topsort();
    cout << ans % mod << endl;

    return 0;
 } 
2020/9/30 11:31
加载中...