题目背景
你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。
题目描述
给你一个食物网,你要求出这个食物网中最大食物链的数量。
(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)
Delia 非常急,所以你只有 1 秒的时间。
由于这个结果可能过大,你只需要输出总数模上 8011200280112002 的结果。
输入格式
第一行,两个正整数 n、m,表示生物种类 n 和吃与被吃的关系数 m。
接下来 m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。
输出格式
一行一个整数,为最大食物链数量模上 8011200280112002 的结果。
输入输出样例
输入 #1
5 7 1 2 1 3 2 3 3 5 2 5 4 5 3 4
输出 #1
5
上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5010;
const int mod = 80112002;
int n,m;
vector<int> h[N];
int chu[N], ru[N];
int f[N];
bool has_fa[N];
LL res = 0;
void tor(){
queue<int> q;
for(int i = 1; i <= n; i++){
if(!has_fa[i]){
q.push(i);
f[i] = 1;
}
}
while(q.size()){
int t = q.front();
q.pop();
if(h[t].size() == 0){
res = (res + f[t]) % mod;
continue;
}
for(int i = 0; i < h[t].size(); i++){
int j = h[t][i];
f[j] = (f[j] + f[t]) % mod;
ru[j]--;
if(ru[j] == 0){
q.push(j);
}
}
}
}
int main(){
scanf("%d%d", &n, &m);
while(m --){
int a, b;
scanf("%d%d", &a, &b);
h[b].push_back(a);
has_fa[a] = true;
chu[b]++;
ru[a]++;
}
tor();
cout<<res;
return 0;
}