1. 程式人生 > 其它 >洛谷 P4017 最大食物鏈計數

洛谷 P4017 最大食物鏈計數

技術標籤:洛谷

題目背景

你知道食物鏈嗎?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; }