3042: 【普及/提高-】【P4017】最大食物链计数
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:4
解决:2
题目描述
给你一个食物网,你要求出这个食物网中最大食物链的数量。
(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)
Delia 非常急,所以你只有 秒的时间。
由于这个结果可能过大,你只需要输出总数模上 的结果。
输入
第一行,两个正整数 ,表示生物种类 和吃与被吃的关系数 。
接下来 行,每行两个正整数,表示被吃的生物A和吃A的生物B。
输出
一行一个整数,为最大食物链数量模上 的结果。
样例输入 复制
5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
样例输出 复制
5
提示
各测试点满足以下约定:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 5005
#define MAXM 500005
#define MOD 80112002
int n,m,ans;
vector <int> p[MAXN];
queue <int> q;
int f[MAXN], ind[MAXN], outd[MAXN];
int main(){
cin >> n >> m;
for (int i = 1; i <=m; i++) {
int x, y;
cin >> x >> y;
outd[x]++; //点x的出度增加1
ind[y]++; //点y的入度增加1
p[x].push_back(y); //用邻接表记录下食物链的关系
}
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++)
if (ind[i] == 0) {
q.push(i); //将入度为0的点加入队列
f[i] = 1;
}
while (!q.empty()) {
int x=q.front();
q.pop();
for (int i = 0, sz = p[x].size(); i < sz; i++) {
int y = p[x][i];
f[y] = (f[x]+f[y]) % MOD;
ind[y]--;
if (ind[y] == 0) //此时点y已经没有入度了,将点y加入队列
q.push(y);
}
}
for (int i = 1; i <= n; i++)
if (outd[i] == 0) ans = (ans + f[i]) % MOD; //在出度为0的点中统计答案
cout << ans <<'\n';
return 0;
}