近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國**決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。經過 who(世界衛生組織)以及全球各國科研部門的努力,這種新興傳染病的傳播途徑和控制方法已經研究清楚,剩下的任務就是由你協助蓬萊國疾控中心制定乙個有效的控制辦法。
研究表明,這種傳染病的傳播具有兩種很特殊的性質;
第一是它的傳播途徑是樹型的,乙個人x只可能被某個特定的人y感染,只要y不得病,或者是xy之間的傳播途徑被切斷,則x就不會得病。
第二是,這種疾病的傳播有週期性,在乙個疾病傳播週期之內,傳染病將只會感染一代患者,而不會再傳播給下一代。
這些性質大大減輕了蓬萊國疾病防控的壓力,並且他們已經得到了國內部分易感人群的潛在傳播途徑圖(一棵樹)。但是,麻煩還沒有結束。由於蓬萊國疾控中心人手不夠,同時也缺乏強大的技術,以致他們在乙個疾病傳播週期內,只能設法切斷一條傳播途徑,而沒有被控制的傳播途徑就會引起更多的易感人群被感染(也就是與當前已經被感染的人有傳播途徑相連,且連線途徑沒有被切斷的人群)。當不可能有健康人被感染時,疾病就中止傳播。所以,蓬萊國疾控中心要制定出乙個切斷傳播途徑的順序,以使盡量少的人被感染。
你的程式要針對給定的樹,找出合適的切斷順序。
輸入格式:
輸入格式的第一行是兩個整數n(1≤n≤300)和p。接下來p行,每一行有兩個整數i和j,表示節點i和j間有邊相連(意即,第i人和第j人之間有傳播途徑相連)。其中節點1是已經被感染的患者。
輸出格式:
只有一行,輸出總共被感染的人數。
輸入樣例#1:
7 61 21 3
2 42 5
3 63 7
輸出樣例#1:
3
思路:
1.dfs
首先連邊,將小號指向大號,然後開始尋找每個點的深度(點1必須為1),接著開始進行dfs+最優性剪枝,如果不能夠再感染他的子節點,就更新ans的值.
2.據說這題貪心是可以過得.
3.據說這題用樹鏈剖分是可以做的.
4.然而2+3我是不會做的
坑點:
一定要將ans賦值為較大的數!!!因為更新答案的時候是取min
上**:
#include #include#include
using
namespace
std;
const
int m = 23333
;const
int inf = 0x7fffffff
;int n,p,ans=inf;
inthead[m],tot;
bool
ill[m];
intdeeps[m];
struct
be[m];
void add(int u,int
v)void finds(int
u)
return;}
void dfs(int deep,int
num)}}
num--;///
因為當前節點已經被感染了,不能再感染一次
for(int i=1;i<=n;i++)
}///回溯
num++;
for(int i=1;i<=n;i++)}}
if(!flag)///
如果不能夠繼續進行感染了
}int
main()
///初始化1節點的狀態
deeps[1]=1;///
1的深度為1
ill[1]=true;///
1被感染了
finds(1);///
尋找每個節點的深度
dfs(1,1);///
尋找答案
printf("
%d\n
",ans);
return0;
}
end.
Luogu P1041 傳染病控制 搜尋
p1041 傳染病控制 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法...
luogu P1041 傳染病控制 dfs
luogu p1041 傳染病控制 x n y n z n 題目背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,...
P1041 傳染病控制
題目背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播。...