noip2003传染病控制 2008.11.5

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.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值