⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t2003_4.pas

📁 noip1998-2004普及
💻 PAS
字号:
program t2003_4(input,output);{Epidemic Control}
const maxn=300;
type l_in=^in_node; {p lines of infect roads}
     in_node=record
         a,b:integer;
         next:l_in;
     end;
     point=^node;    { sub tree nodes}
     node=record
        v:integer;{first is the number of subs;others are the name of the sub}
        next:point;
     end;

var
    h1,p1,p2:l_in;
    n,p:integer;
    h2,t2:integer;{worksheet point}
    f:array[1..maxn] of integer; {worksheet}
    fh,ft:integer;
    g:array[1..maxn] of point;
    gh,gp,gq:point;
    i:integer;
    r,s:integer;

procedure de(gd:integer);
var gk,gm:point;
begin
    gk:=g[gd];gm:=gk^.next;
    while gm<>nil do begin
        gk^.next:=gm^.next;dispose(gm);gm:=gk^.next;
    end;
    gk^.v:=0;
end;

procedure merge(bin,gd:integer);
var gk,gm:point;
begin
    g[bin]^.v:=g[bin]^.v+g[gd]^.v;
    gk:=g[bin];gm:=gk^.next;
    while gm<>nil do begin gm:=gm^.next;gk:=gk^.next;end;
    gk^.next:=g[gd]^.next;
    g[gd]^.next:=nil;
    g[gd]^.v:=0;
end;
function big(a,b:integer):boolean;
var max1,max2:integer;gp:point;
begin
    if g[a]^.v>g[b]^.v then
        big:=true
    else if g[a]^.v<g[b]^.v then
        big:=false
    else begin
        max1:=0;
        gp:=g[a]^.next;
        while gp<>nil do begin
          {  if g[gp^.v]^.v>max1 then max1:=g[gp^.v]^.v;}
            max1:=max1+g[gp^.v]^.v;
            gp:=gp^.next;
        end;
        max2:=0;
        gp:=g[b]^.next;
        while gp<>nil do begin
          {  if g[gp^.v]^.v>max2 then max2:=g[gp^.v]^.v; }
            max2:=max2+g[gp^.v]^.v;
            gp:=gp^.next;
        end;
        if max1>max2 then big:=true
        else big:=false;
    end;
end;

function count(i:integer):integer;
var gp,gq:point;
    bin,dele,gt:integer;
    c:integer;
    csum:integer;
    ggg:point;
begin
    gp:=g[i]^.next;
    if gp=nil then count:=0
    else begin
        gq:=gp^.next;
        if gq=nil then count:=0
        else begin
             c:=1;
             if big(gq^.v,gp^.v) then
                    begin bin:=gp^.v;dele:=gq^.v;end
             else
                    begin bin:=gq^.v;dele:=gp^.v;end;
             gq:=gq^.next;
             while gq<>nil do begin
                 if big(dele,gq^.v) then gt:=gq^.v
                   else begin gt:=dele;dele:=gq^.v;end;
                 if g[gt]^.v>0 then
                      merge(bin,gt);
                 c:=c+1;
                 gq:=gq^.next;
             end;
             de(dele);
{             writeln;
             writeln('c=',c,' bin=',bin,' dele=',dele);
             ggg:=g[bin];
             while ggg<>nil do begin write(ggg^.v,' ');ggg:=ggg^.next;end;
             writeln;
}
             csum:=count(bin);
{             writeln('count=',c+csum);}
             count:=c+csum;

         end;
    end;
end;

begin
    assign(input,'epidemic.in');
    reset(input);
    readln(n,p);
    i:=1;new(h1);h1^.next:=nil;p1:=h1;
    while i<=p do begin
       new(p2);
       readln(r,s);
       p2^.a:=r;p2^.b:=s;
       p2^.next:=nil;
       p1^.next:=p2;
       p1:=p2;
       i:=i+1;
    end;
    close(input);
    assign(output,'epidemic.out');
    rewrite(output);

    for i:=2 to n do f[i]:=0;
    f[1]:=1;
    for i:=1 to n do begin new(g[i]);g[i]^.next:=nil; g[i]^.v:=0;end;
    fh:=1;ft:=2;
    while f[fh]<>0 do begin
       p1:=h1;p2:=p1^.next;
       while (p2<>nil) do begin
           while (p2<>nil) and (p2^.a<>f[fh]) and (p2^.b<>f[fh]) do
               begin p2:=p2^.next;p1:=P1^.next;end;
           if p2<>nil then begin
              if p2^.a=f[fh] then r:=p2^.b
                  else r:=p2^.a;
              f[ft]:=r;ft:=ft+1;
              gp:=g[f[fh]];gq:=gp^.next;
              while gq<>nil do begin gp:=gp^.next;gq:=gq^.next;end;
              new(gq);
              g[f[fh]]^.v:=g[f[fh]]^.v+1;
              gq^.v:=r;gq^.next:=nil;
              gp^.next:=gq;
              p1^.next:=p2^.next;
              dispose(p2);
              p2:=p1^.next;
           end;
       end;
       fh:=fh+1;
    end;
{
for fh:=1 to n do write(f[fh],' ');writeln;
for fh:=1 to n do begin
    gp:=g[fh];
    write(gp^.v);
    gp:=gp^.next;
    while gp<>nil do begin
        write(' ',gp^.v);
        gp:=gp^.next;
    end;
    writeln;
end;
}

    writeln(1+count(1));
    close(output);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -