Luogu P1041 傳染病控制 搜尋

2022-05-20 02:18:46 字數 1971 閱讀 2815

p1041 傳染病控制

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

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

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

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

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

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

第一行是兩個整數\(n(1\leq n\leq 300)\)和\(p\)。

接下來\(p\)行,每一行有\(2\)個整數\(i\)和\(j\),表示節點\(i\)和\(j\)間有邊相連。(意即,第\(i\)人和第\(j\)人之間有傳播途徑相連)。其中節點\(1\)是已經被感染的患者。

\(1\)行,總共被感染的人數。

7 6

1 21 3

2 42 5

3 63 7

3
暴搜,然後來慢慢優化演算法。

暴搜的方法也很簡單,列舉每次切斷的途徑,再來判斷接下來傳染病如何傳播,模擬即可。

如果我們不去切樹,會發現點被感染的時間其實就是點在樹中的深度。所以我們可以先預處理各點的深度,每次就可以直接得到新感染的點有哪些。

再加上最優性剪枝,即如果還沒有感染的點已經小於之前搜尋得到的答案了,直接返回。其實這麼剪枝已經可以\(ac\)了,但是實際上如果加上記憶化剪枝,可以大大加快執行速度,不過這個我就沒有嘗試了。

#includeusing namespace std;

const int maxn=305;

const int maxm=10000005;

int n,m,ans=int_max,mxdep,dep[maxn],sz[maxn];

int cnt,top[maxn],to[maxn<<1],nex[maxn<<1];

int _cnt,_top[maxn],_to[maxm],_nex[maxm];

int read()

void dfs1(int now)

}void dfs2(int dp,int rest,int cut)

int tot=0;_top[dp+1]=0;

for(int i=_top[dp];i;i=_nex[i])

if(rest-tot>=ans) return ;

if(!tot)

for(int i=_top[dp+1];i;i=_nex[i]) dfs2(dp+1,rest-sz[_to[i]],_to[i]);

}int main()

dep[1]=sz[1]=1;

dfs1(1);

_to[++_cnt]=1,_nex[_cnt]=_top[1],_top[1]=_cnt;

dfs2(1,n,0);

printf("%d",ans);

return 0;

}

luoguP1041 傳染病控制 x

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

luogu P1041 傳染病控制 dfs

luogu p1041 傳染病控制 x n y n z n 題目背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,...

P1041 傳染病控制

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