你知道食物鏈嗎?delia 生物考試的時候,數食物鏈條數的題目全都錯了,因為她總是重複數了幾條或漏掉了幾條。於是她來就來求助你,然而你也不會啊!寫乙個程式來幫幫她吧。
給你乙個食物網,你要求出這個食物網中最大食物鏈的數量。
(這裡的「最大食物鏈」,指的是生物學意義上的食物鏈,即最左端是不會捕食其他生物的生產者,最右端是不會被其他生物捕食的消費者。)
delia 非常急,所以你只有 11 秒的時間。
由於這個結果可能過大,你只需要輸出總數模上 8011200280112002 的結果。
第一行,兩個正整數 n、mn、m,表示生物種類 nn 和吃與被吃的關係數 mm。
接下來 mm 行,每行兩個正整數,表示被吃的生物a和吃a的生物b。
一行乙個整數,為最大食物鏈數量模上 8011200280112002 的結果。
輸入 #1複製
輸出 #1複製5 7
1 21 3
2 33 5
2 54 5
3 4
5
各測試點滿足以下約定:
【補充說明】
資料中不會出現環,滿足生物學的要求。(感謝 @akee )
剛開始理解錯題意了2333
正解:求這個有向無環圖中有共有幾條食物鏈,每條食物鏈必須是 最弱者到最強者。
很明顯這跟拓撲排序有關。
操作:1. 記錄每個點的出度跟入度。
2. 找到入度為0的乙個點i,將與它相連的邊刪掉,相連的點j的入度-1。那麼有f[j]=f[j]+f[i],即從i到j的路線數。期間有入度為0的點進入佇列,當有點出度跟入度都為0,說明這條食物鏈結束了。
3.不斷重複2.
拓撲排序可以判斷有向圖是否有環,若經過上面的三步還有點剩餘,說明這個圖是有環的。
#include using namespace std;
const int mod=80112002;
int in[5005],out[5005],f[5005],a[5005][5005];
queueq;
int main()
for(int i=1; i<=n; i++)
}while(!q.empty())
if(in[i]==0&&out[i]==0)}}
}cout<
return 0;
}//拓撲排序
P4017 最大食物鏈計數
你知道食物鏈嗎?delia生物考試的時候,數食物鏈條數的題目全都錯了,因為她總是重複數了幾條或漏掉了幾條。於是她來就來求助你,然而你也不會啊!寫乙個程式來幫幫她吧。給你乙個食物網,你要求出這個食物網中最大食物鏈的數量。這裡的 最大食物鏈 指的是生物學意義上的食物鏈,即最左端是不會捕食其他生物的生產者...
P4017 最大食物鏈計數
miku 很水的拓撲排序 dp 看錯題除外。這道題是要求有多少條食物鏈滿足 左端是不會捕食其他生物的生產者,最右端是不會被其他生物捕食的消費 不是求最長的多長或者有幾條最長!把一些無關緊要的變數起一些人名真有意思 include includeusing namespace std queueq s...
P4017 最大食物鏈計數
狀態表示 f i 表示從 i 開始的所有食物鏈的集合,儲存個數屬性 狀態計算 f i f j 1 f j 2 f j k 其中 j k 為 i 的第 k 個後繼結點 思路 從每乙個最大的捕食者出發跑一遍記憶化,把從他開始的所有食物鏈的個數加上。include includeusing namespa...