Cod sursa(job #186414)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 27 aprilie 2008 21:26:21
Problema Asmax Scor 50
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.4 kb
// Asmax - infoarena
// complexitate O(n)

type pelem=^elem;
     elem=record
       info:integer;
       next:pelem;
     end;

var fi,fo:text;
    n,i,a,b,ct:integer;
    max:longint;
    v,t,f:array[1..16000]of longint;
    leg:array[1..16000]of pelem;
    s:array[1..16000,1..16000]of byte;
    p:pelem;

procedure df(nod:integer);
var p:pelem;
begin
  p:=leg[nod];
  while p<>nil do
    begin
      if s[p^.info,nod]=0 then
        begin
          s[p^.info,nod]:=1;
          s[nod,p^.info]:=1;
          df(p^.info);
        end;
      p:=p^.next;
    end;
  inc(ct);
  T[ct]:=nod;
end;

begin
  assign(fi,'asmax.in'); reset(fi);
  assign(fo,'asmax.out'); rewrite(fo);
  read(fi,n);
  for i:=1 to n do
    read(fi,v[i]);
  for i:=1 to n-1 do
    begin
      read(fi,a,b);
      new(p);
      p^.info:=a;
      p^.next:=leg[b];
      leg[b]:=p;
      new(p);
      p^.info:=b;
      p^.next:=leg[a];
      leg[a]:=p;
    end;
  ct:=0;
  df(1);
  for i:=1 to n do
    if v[t[i]]>0 then
      begin
        p:=leg[t[i]];
        while p<>nil do
          begin
            if f[p^.info]=0 then
              v[p^.info]:=v[p^.info]+v[t[i]];
            p:=p^.next;
          end;
        f[t[i]]:=1;
      end
    else
      f[t[i]]:=1;
  max:=-1000;
  for i:=1 to n do
    if v[i]>max then max:=v[i];
  writeln(fo,max);
  close(fi);
  close(fo);
end.