洛谷 P4017 最大食物鏈計數
阿新 • • 發佈:2021-01-31
技術標籤:洛谷
題目背景
你知道食物鏈嗎?Delia 生物考試的時候,數食物鏈條數的題目全都錯了,因為她總是重複數了幾條或漏掉了幾條。於是她來就來求助你,然而你也不會啊!寫一個程式來幫幫她吧。
題目描述
給你一個食物網,你要求出這個食物網中最大食物鏈的數量。
(這裡的“最大食物鏈”,指的是生物學意義上的食物鏈,即最左端是不會捕食其他生物的生產者,最右端是不會被其他生物捕食的消費者。)
Delia 非常急,所以你只有 1 秒的時間。
由於這個結果可能過大,你只需要輸出總數模上 80112002 的結果。
輸入格式
第一行,兩個正整數n、m,表示生物種類 n 和吃與被吃的關係數 m。
接下來 m 行,每行兩個正整數,表示被吃的生物A和吃A的生物B。
輸出格式
一行一個整數,為最大食物鏈數量模上 8011200280112002 的結果。
輸入輸出樣例
輸入
5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
輸出
5
說明
各測試點滿足以下約定:
AC的C++程式碼:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MOD 80112002
struct node{
int n;
node * next;
};
node v[100005];
bool isStart[ 100005];
int dp[100005];
void insertnode(int a,int b){
node * t;
t = new node;
t->n = b;
t->next = v[a].next;
v[a].next = t;
isStart[b] = false;
return;
}
int dfs(int x){
int ans;
if(dp[x]!=-1)
return dp[x];
else if(v[x].next == NULL){
dp[ x] = 1;
return 1;
}
node * p;
p = v[x].next;
ans = 0;
while(p!=NULL) {
ans += dfs(p->n);
ans %= MOD;
p = p->next;
}
dp[x] = ans;
return dp[x];
}
int main(){
int n,m,a,b,ans;
while(cin >> n >> m) {
for(int i=1;i<=n;i++) {
v[i].n = i;
v[i].next = NULL;
isStart[i] = true;
dp[i] = -1;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
insertnode(a,b);
}
ans = 0;
for(int i=1;i<=n;i++){
if(isStart[i]&&v[i].next!=NULL)
ans += dfs(v[i].n) ;
ans %= MOD;
}
printf("%d\n",ans);
}
return 0;
}