C++ shuffle函式,重排序給定範圍 [first, last) 中的元素(打亂順序)。
阿新 • • 發佈:2020-12-18
技術標籤:洛谷
P4017 最大食物鏈計數
題目背景
你知道食物鏈嗎?Delia 生物考試的時候,數食物鏈條數的題目全都錯了,因為她總是重複數了幾條或漏掉了幾條。於是她來就來求助你,然而你也不會啊!寫一個程式來幫幫她吧。
題目描述
給你一個食物網,你要求出這個食物網中最大食物鏈的數量。
(這裡的“最大食物鏈”,指的是生物學意義上的食物鏈,即最左端是不會捕食其他生物的生產者,最右端是不會被其他生物捕食的消費者。)
Delia 非常急,所以你只有11秒的時間。
由於這個結果可能過大,你只需要輸出總數模上8011200280112002的結果。
輸入格式
第一行,兩個正整數n、mn、m,表示生物種類nn和吃與被吃的關係數mm。
接下來mm行,每行兩個正整數,表示被吃的生物A和吃A的生物B。
輸出格式
一行一個整數,為最大食物鏈數量模上8011200280112002的結果。
輸入輸出樣例
輸入 #1複製
5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
輸出 #1複製
5
說明/提示
各測試點滿足以下約定:
【補充說明】
資料中不會出現環,滿足生物學的要求。(感謝 @AKEE )
#include<bits/stdc++.h> using namespace std; int n,m,ru[5005],chu[5005],a,b,f[5005],ans;// int mp[5005][5005]; queue<int> q; int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ scanf("%d%d", &a, &b); mp[a][b]=1;//記錄關係 chu[a]++; ru[b]++;//記錄入度和出度 } for(int i=1;i<=n;i++){ if(ru[i]==0) { f[i]=1; q.push(i);//入度為零的入隊 } } while(!q.empty()){//佇列不為空 int a=q.front(); q.pop();//出隊 for(int k=1;k<=n;k++){ if(mp[a][k]==0)continue; f[k]+=f[a];//更新 f[k]%=80112002; ru[k]--;//食物少了一個 if(ru[k]==0){//入隊為零才入隊 if(chu[k]==0){ ans+=f[k]; ans%=80112002; continue;//有沒有都行 } q.push(k); } } } cout<<ans; }