P1041 傳染病控制

2022-04-30 00:48:22 字數 1702 閱讀 2636

題目背景

近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國**決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。經過 \(who\) (世界衛生組織)以及全球各國科研部門的努力,這種新興傳染病的傳播途徑和控制方法已經研究清楚,剩下的任務就是由你協助蓬萊國疾控中心制定乙個有效的控制辦法。

題目描述

研究表明,這種傳染病的傳播具有兩種很特殊的性質;

第一是它的傳播途徑是樹型的,乙個人 \(x\) 只可能被某個特定的人 \(y\) 感染,只要 \(y\) 不得病,或者是 \(xy\) 之間的傳播途徑被切斷,則 \(x\) 就不會得病。

第二是,這種疾病的傳播有週期性,在乙個疾病傳播週期之內,傳染病將只會感染一代患者,而不會再傳播給下一代。

這些性質大大減輕了蓬萊國疾病防控的壓力,並且他們已經得到了國內部分易感人群的潛在傳播途徑圖(一棵樹)。但是,麻煩還沒有結束。由於蓬萊國疾控中心人手不夠,同時也缺乏強大的技術,以致他們在乙個疾病傳播週期內,只能設法切斷一條傳播途徑,而沒有被控制的傳播途徑就會引起更多的易感人群被感染(也就是與當前已經被感染的人有傳播途徑相連,且連線途徑沒有被切斷的人群)。當不可能有健康人被感染時,疾病就中止傳播。所以,蓬萊國疾控中心要制定出乙個切斷傳播途徑的順序,以使盡量少的人被感染。

你的程式要針對給定的樹,找出合適的切斷順序。

這是一道結論題,只要找到了結論,我們就能很快的求解

那是什麼結論呢?

我們就想要看題,看題,看題。反反覆覆的從題目描述中尋找有用的資訊

最終,我們從資料範圍中找到了結論。

ps:正解就是搜尋((⊙﹏⊙)b),上面都是我扯的

正著搜,反著搜。dfs搜,bfs搜都可以qwq

反著可以胡亂搞事情

tle? 套乙個最優性剪枝唄

思路:先預處理出每一層的節點(因為感染順序是一層一層的)

然後根據其父節點有沒有被感染(如果沒有被感染就是有一條路徑被切斷了),判斷其是否會被感染

然後胡亂列舉一條邊切斷(程式中並不是真正的將邊斷開,而是通過safe標記),進行搜尋

#include#include#include#include#includeusing std::vector;

using std::min;

const int maxn=310;

struct node

;node line[maxn<<1];

int head[maxn],tail;

void add(int a,int b)

vectord[maxn];

int dep[maxn];

int f[maxn];

bool safe[maxn];

void dfs(int now,int fa)

int ans=0x7fffffff;//當前最優解,初值無限大(inf)

void dfs(int now,int dep,int get)

if(nxt==0)//成功阻斷

for(int i=0;ifor(int i=0;ireturn ;

}int main()

dfs(1,0);//預處理

dfs(1,1,1);//搜尋qwq

printf("%d",ans);

}

P1041 傳染病控制(dfs)

近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。經過 wh...

洛谷P1041 傳染病控制

近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。經過 wh...

P1041 傳染病控制(noip2003)(搜尋)

呃呃呃。真的是慘烈啊。今天的模擬賽是真的慘。本題,正解居然是搜尋!蒟蒻自己歪歪了乙個貌似是正解但是卻連一半都沒過的錯解。先解釋一下自己的dp思路把。f i u v 0 1 表示第i秒 等效於深度 uv之間的邊斷還是不斷。轉移有兩個 f dep u u v 1 size v 表示此邊斷,然後下面的點全...