洛谷P2597 災難

2022-06-13 14:30:11 字數 1033 閱讀 1918

乙個食物網有 \(n\) 個點,代表 \(n\) 種生物,生物從 \(1\) 到 \(n\) 編號。

如果生物 \(x\) 可以吃生物 \(y\),那麼從 \(y\) 向 \(x\) 連乙個有向邊。

這個圖沒有環。

圖中有一些點沒有連出邊,這些點代表的生物都是生產者,可以通過光合作用來生存。

而有連出邊的點代表的都是消費者,它們必須通過吃其他生物來生存。

如果某個消費者的所有食物都滅絕了,它會跟著滅絕。

我們定義乙個生物在食物網中的「災難值」為,如果它突然滅絕,那麼會跟著一起滅絕的生物的種數。

給定乙個食物網,你要求出每個生物的災難值。

\(n\leq 65534,m\leq 10^6\)。

如果 \(x\) 吃 \(y\),那麼就從 \(y\) 向 \(x\) 連邊。這樣我們得到了一張 dag。每乙個點的答案就是直接或間接連向他的點的數量。

建立乙個虛根 \(s\),從 \(s\) 向度數為 \(0\) 的點連邊。然後拓撲排序。每次取出隊首 \(u\) 後,用倍增 lca 求它的祖先,然後列舉 \(u\) 連向的點 \(v\),容易發現 \(v\) 應該被它被連向的點的 lca 支配。然後不斷更新 \(v\) 的父親節點即可。

最後建出支配樹,答案就是每乙個點的子樹大小了。

時間複雜度 \(o(n\log n)\)。

#include using namespace std;

const int n=70010,m=1000010,lg=18;

int n,s;

struct edge

;struct tree

; head[from]=tot; }

int lca(int x,int y)

void dfs(int x)

}}}t;

struct graph

; head[from]=tot; deg[to]++; }

void topsort()

}}}g;

int main()

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...

洛谷練習P2279 P1346

2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...

洛谷 P1396 營救

題目描述 咚咚咚 查水表!原來是查水表來了,現在 找這麼熱心上門的查表員啊!小明感動的熱淚盈眶,開起了門 媽媽下班回家,街坊鄰居說小明被一群陌生人強行押上了警車!媽媽豐富的經驗告訴她小明被帶到了t區,而自己在s區。該市有m條大道連線n個區,一條大道將兩個區相連線,每個大道有乙個擁擠度。小明的媽媽雖然...