洛谷 P4017 最大食物鏈計數(拓撲排序)

2021-10-09 04:39:27 字數 913 閱讀 7633

思路

圖為有向無環圖,由於需要統計的是最大的食物鏈,也就是最低端為生產者,入度為0,最右端的消費者出度為0,我們可以這樣,在拓撲排序的過程中,統計到各個點的方法數,也就是假如這個點就是頂端,有多少條,這個很簡單,隨著拓撲排序的進行逐步遞推即可,到當前點的方案數為它上一級各方案數之和。故將每乙個入度為0的點放到佇列中,且方案數初始化為1,其他點為0,走一遍拓撲排序即可。

**

#include

#include

#include

#include

using

namespace std;

const

int n =

5005

;const

int mod =

80112002

;int n, m;

vector <

int> g[n]

;queue <

int> q;

int chu[n]

, ru[n]

;int sum[n]

, ans;

intmain()

for(

int i =

1; i <= n; i++)if

(!ru[i]

)while

(!q.

empty()

) q.

push

(nex);}

}}// for (int i = 1; i <= n; i++) cout << chu[i] << " ";

// cout << endl;

cout << ans << endl;

return0;

}

P4017 最大食物鏈計數(洛谷)

傳送門 這道題就是記憶化搜尋。中文題面,不解釋 這道題拓撲排序,存在 不存在拓撲路徑都得算入。用鄰接表實現 根據題目的最大食物鏈的規定,我們需要從出度為零的點開始搜,一直搜到入度為零的點結束。也可以從入度為0的點開始,到出度為0的點結束 這樣算一條路徑。然後累加即可。用vis標記一下。即我們從出度為...

洛谷 P4017 最大食物鏈計數

看到這種明顯的有向無環圖,並且等級分明,自然而然就能想到拓補排序啦。對於這道題,我們就可以利用最短路計數的那種思想 不知道也沒關係 設 j 是 i 的後繼,dis i 表示以 i 為結尾有多少條食物鏈,那麼就可以得到 dis j dis i 然後往後面推,直到拓補排序結束。因為題目要求的是沒有可以吃...

洛谷 P4017 最大食物鏈計數

洛谷傳送門 你知道食物鏈嗎?delia生物考試的時候,數食物鏈條數的題目全都錯了,因為她總是重複數了幾條或漏掉了幾條。於是她來就來求助你,然而你也不會啊!寫乙個程式來幫幫她吧。給你乙個食物網,你要求出這個食物網中最大食物鏈的數量。這裡的 最大食物鏈 指的是生物學意義上的食物鏈,即最左端是不會捕食其他...