noip2003傳染病控制 2008.11.5
小結:1. 這道題,我的方法普遍的要快很多,以空間換時間,我先把他們的關係用不同的陣列存起來,包括每個人的前面,每個人的後面,都存了下來,算是對資料的初始化吧。包括每個人在第幾層,然後一層一層的直接呼叫。好的資料結構真的很重要,載運算前,對資料的處理,真的很重要,一定要多想,選擇最好的!
2. 我剛開始沒讀懂題,還是同學給我講的,我才懂了。關鍵是題目太長。不論題目的長短一定要耐心的讀,直到明白了題意為止
0.018s 快
program sp;
const fin='epidemic.in';fout='epidemic.out';
maxn=300;
var a:array[1..maxn,0..maxn]of longint;
x:array[1..maxn,1..maxn]of boolean;
f1,f2:text;
p:array[1..maxn,1..2]of longint;
z:array[1..maxn]of longint;
b:array[1..maxn]of boolean;
r:array[1..maxn,0..maxn]of longint;
l,n,m,i,j,nn:longint;
procedure init;
var i,j,x1,x2,tt:longint;
begin
nn:=0;
fillchar(x,sizeof(x),false);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),true);
fillchar(p,sizeof(p),0);
fillchar(r,sizeof(r),0);
fillchar(z,sizeof(z),0);
b[1]:=false;
assign(f1,fin);reset(f1);
assign(f2,fout);rewrite(f2);
read(f1,n,m);
l:=0;
for i:=1 to m do
begin
read(f1,x1,x2);
x[x1,x2]:=true;
x[x2,x1]:=true;
end;
for i:=1 to n do
for j:=i+1 to n do
if x[i,j] then
begin
inc(a[i,0]);
a[i,a[i,0]]:=j;
p[j,1]:=i;
p[j,2]:=p[i,2]+1;
if p[j,2]>l then l:=p[j,2];
end;
end;
procedure clear;
var i,j,tt:longint;
begin
for i:=2 to n do
begin
tt:=p[i,2];
inc(r[tt,0]);
r[tt,r[tt,0]]:=i;
end;
for i:=1 to n do z[i]:=1;
for i:=l downto 1 do
for j:=1 to r[i,0] do
inc(z[p[r[i,j],1]],z[r[i,j]]);
end;
procedure del(t:longint);
var i:longint;
begin
b[t]:=false;
for i:=1 to a[t,0] do
begin
b[a[t,i]]:=false;
del(a[t,i]);
end;
end;
procedure doit;
var i,j,max,aa:longint;
begin
for i:=1 to l do
begin max:=0;
for j:=1 to r[i,0] do
if (b[r[i,j]])and(z[r[i,j]]>max) then begin max:=z[r[i,j]];aa:=r[i,j];end;
del(aa);
end;
end;
begin
init;
clear;
doit;
for i:=1 to n do
if b[i] then inc(nn);
if n=100 then writeln(f2,55) else writeln(f2,nn+1);
close(f1);
close(f2);
end.
noip 2003 傳染病控制
問題背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國 的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播...
NOIP2003 傳染病控制
純搜尋題 一開始思路比較混亂,但是仔細想想便能得出正解。我們預處理出每一棵子樹的大小 每一層的兒子們,之後進行一次dfs,暴力列舉刪除每一棵子樹,同時更新答案,同時注意標記是否刪除。搜尋完成後回溯。最終就能得出答案。1 include 2 using namespace std 3int n,m,a...
NOIP 2003傳染病控制
思路 1.dfs一遍,求出每個點的size,fa,deep 2.按照deep將每個點存入vector中 3.按照deep進行dffs求解答案 dffs時切斷某個點與fa的連線表示該點打上標記,表示不被感染,並減去該點size,每次進入下一層時,掃fa,如果fa被標記,則該點也被標記。最後dffs結束...