1. 程式人生 > >傳染病控制

傳染病控制

背景 who 標記 std scan find 新的 時也 並且

題目背景

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

題目描述

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

第一是它的傳播途徑是樹型的,一個人X只可能被某個特定的人Y感染,只要Y不得病,或者是XY之間的傳播途徑被切斷,則X就不會得病。

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

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

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

輸入輸出格式

輸入格式:

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

輸出格式:

只有一行,輸出總共被感染的人數。

輸入輸出樣例

輸入樣例#1:
7 6
1 2
1 3
2 4
2 5
3 6
3 7
輸出樣例#1:

裸搜
思路很簡單,枚舉每一層保護誰,然後標記
之後就不保護祖先節點被標記過的節點
判斷用一個find,直接往上找
 1 #include<iostream>
 2 #include<cstdio>
 3
#include<cstring> 4 #include<algorithm> 5 using namespace std; 6 struct Node 7 { 8 int next,to; 9 }edge[6001]; 10 int num,head[3001]; 11 int ans=2e9,n,p,b[3001],dep[3001],fa[3001],l[3001],c[301][301]; 12 int maxdep; 13 void add(int u,int v) 14 { 15 num++; 16 edge[num].next=head[u]; 17 head[u]=num; 18 edge[num].to=v; 19 } 20 bool find(int x) 21 { 22 if (x==1)return 1; 23 if (!b[fa[x]]||fa[x]==1) 24 return find(fa[x]); 25 return 0; 26 } 27 void pre(int x,int pa) 28 {int i; 29 dep[x]=dep[pa]+1; 30 maxdep=max(maxdep,dep[x]); 31 l[dep[x]]++; 32 c[dep[x]][l[dep[x]]]=x; 33 fa[x]=pa; 34 for (i=head[x];i;i=edge[i].next) 35 { 36 int v=edge[i].to; 37 if (v!=pa) 38 { 39 pre(v,x); 40 } 41 } 42 } 43 void dfs(int x,int s) 44 {int i; 45 if (x>maxdep) 46 { 47 ans=min(ans,s); 48 return; 49 } 50 if (s>ans) return; 51 int p=0; 52 for (i=1;i<=l[x];i++) 53 { 54 if (find(c[x][i])) 55 p++,b[c[x][i]]=0; 56 else b[c[x][i]]=1; 57 } 58 if (p==0) 59 { 60 ans=min(ans,s); 61 return; 62 } 63 for (i=1;i<=l[x];i++) 64 { 65 if (b[c[x][i]]==0) 66 { 67 b[c[x][i]]=1; 68 dfs(x+1,s+p-1); 69 b[c[x][i]]=0; 70 } 71 } 72 } 73 int main() 74 {int u,v,i; 75 cin>>n>>p; 76 for (i=1;i<=p;i++) 77 { 78 scanf("%d%d",&u,&v); 79 add(u,v); 80 add(v,u); 81 } 82 pre(1,0); 83 dfs(2,1); 84 cout<<ans; 85 }

傳染病控制