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.