Luogu P4017 最大食物链计数

Luogu P4017 最大食物链计数

Luogu P4017 最大食物链计数

思路

这个题一看到什么从入度为零的点到出度为零的点,很容易想到toposort。这个题就是最基本的toposort+DAG DP,没啥好说的……

主要注意一定是遇到出度为0的点,一条食物链才能算是结束,才能够累加答案。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define MAXN 5010
#define MAXM 500010
#define MOD 80112002
int n, m, res;
int head[MAXN], cnt;
int in[MAXN], out[MAXN];
int f[MAXN];
struct node{
    int from, nxt, to;
} edge[MAXM];
inline int read(void){
    int f = 1, x = 0;char ch;
    do{ch = getchar();if(ch=='-')f = -1;} while (ch < '0' || ch > '9');
    do{ x = (x << 1) +(x << 3) + ch - '0';ch = getchar();} while (ch >= '0' && ch <= '9');
    return f * x;
}
inline void add_edge(int x,int y){
    ++cnt;
    edge[cnt].nxt = head[x];
    edge[cnt].from = x;
    edge[cnt].to = y;
    head[x] = cnt;
    return;
}
std::queue<int> Q;
inline void _init(void){
    for (int i = 1; i <= n;++i){
        if(!in[i]) Q.push(i), f[i] = 1;
    }
    return;
}
void toposort(void){
    _init();
    while(!Q.empty()){
        int u = Q.front();
        Q.pop();
        for (int i = head[u]; i;i=edge[i].nxt){
            int v = edge[i].to;
            f[v] = (f[v] * 1ll + f[u] * 1ll) % MOD;
            --in[v];
            if(!in[v]){
                if(!out[v])
                    res = (res + f[v]) % MOD;
                else Q.push(v);
            }
        }
    }
    return;
}
int main(void){
    n = read(), m = read();
    for (int i = 1; i <= m;++i){
        int u = read(), v = read();
        add_edge(u, v); 
        ++in[v], ++out[u];
    }
    toposort();
    printf("%d\n", res);
    return 0;
}

上一篇:故障定级标准


下一篇:IEEE Fraud Detection Competition思路探索