记录编号 9981 评测结果 AAAAA
题目名称 医院设置 最终得分 100
用户昵称 Gravatarmaxiem 是否通过 通过
代码语言 Pascal 运行时间 0.002 s
提交时间 2009-04-23 15:17:15 内存使用 0.16 MiB
显示代码纯文本
program hospital;
var
  i,j,n:shortint;
  table:array [-1..100] of record
    p,l,r,v:longint;
    d:array [-1..100] of longint;
  end;
  f,flag:array [-1..100] of boolean;
  q:array [0..100] of shortint;
  tmp,sum:longint;
procedure init(no,step:integer);
begin
  table[1].d[no]:=step;f[no]:=true;
  if (table[no].d[table[no].l]=0) and not(f[table[no].l]) then init(table[no].l,step+1);
  if (table[no].d[table[no].r]=0) and not(f[table[no].r]) then init(table[no].r,step+1);
  if (table[no].d[table[no].p]=0) and not(f[table[no].p]) then init(table[no].p,step+1);
end;
procedure change(no:shortint;c:shortint);
var
  cv,t:integer;
begin
  fillchar (q,sizeof(q),0);
  fillchar (f,sizeof(f),0);
  f[c]:=true;
  cv:=1-table[c].d[no];table[c].d[no]:=1;
  q[0]:=1;q[1]:=no;f[no]:=true;
  while not(q[0]=0) do begin
    q[q[0]+1]:=-1;
    if (table[q[q[0]]].l<>c) and not(f[table[q[q[0]]].l]) and (table[q[q[0]]].l>0) then q[q[0]+1]:=table[q[q[0]]].l else
      if (table[q[q[0]]].r<>c) and not(f[table[q[q[0]]].r]) and (table[q[q[0]]].r<>0) then q[q[0]+1]:=table[q[q[0]]].r else
        if (table[q[q[0]]].p<>c) and not(f[table[q[q[0]]].p]) and (table[q[q[0]]].p<>0) then q[q[0]+1]:=table[q[q[0]]].p;
    if q[q[0]+1]<>-1 then begin
      inc(q[0]);
      f[q[q[0]]]:=true;
      inc(table[c].d[q[q[0]]],cv);
    end
    else dec(q[0]);
  end;
end;
procedure get(no:shortint);
var cp,cl,cr:shortint;
begin
  if flag[table[no].p] then table[no].d:=table[table[no].p].d else
    if flag[table[no].l] then table[no].d:=table[table[no].l].d else table[no].d:=table[table[no].r].d;
  table[no].d[no]:=0;
  if table[no].p<>0 then change(table[no].p,no);
  if table[no].l<>0 then change(table[no].l,no);
  if table[no].r<>0 then change(table[no].r,no);
end;
procedure find(no:integer);
begin
  f[no]:=true;
  if (flag[no]) then begin
    if (not(f[0])) and (table[no].l<>0) and not(f[table[no].l]) then find(table[no].l);
    if (not(f[0])) and (table[no].r<>0) and not(f[table[no].r]) then find(table[no].r);
    if (not(f[0])) and (table[no].p<>0) and not(f[table[no].p]) then find(table[no].p);
  end
  else begin
    tmp:=no;
    f[0]:=true;
  end;
end;
function judge:boolean;
var i:integer;
begin
  judge:=true;
  for i:=1 to n do if flag[i]=false then begin
    judge:=false;
    exit;
  end;
end;
begin
  fillchar (table,sizeof(table),$FF);
  fillchar (flag,sizeof(flag),0);
  assign (input,'hospital.in');
  reset (input);
  readln (n);
  for i:=1 to n do begin
    readln (table[i].v,table[i].l,table[i].r);
    if table[i].l<>0 then begin
      table[i].d[table[i].l]:=0;
      table[table[i].l].p:=i;
      table[table[i].l].d[i]:=0;
    end;
    if table[i].r<>0 then begin
      table[i].d[table[i].r]:=0;
      table[table[i].r].p:=i;
      table[table[i].r].d[i]:=0;
    end;
  end;
  close (output);
  assign (output,'hospital.out');
  rewrite (output);
  init(1,0);sum:=maxlongint;
  flag[1]:=true;
  while not(judge) do begin
    fillchar (f,sizeof(f),0);
    find(1);
    get(tmp);
    flag[tmp]:=true;
  end;
  for i:=1 to n do begin
    tmp:=0;
    for j:=1 to n do tmp:=tmp+table[i].d[j]*table[j].v;
    if tmp<sum then sum:=tmp;
  end;
  writeln (sum);
  close (output);
end.