Cod sursa(job #1369962)

Utilizator casianos1996Marc Casian Nicolae casianos1996 Data 3 martie 2015 12:26:19
Problema Problema Damelor Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 3.33 kb
program apm;

type     vect=array[0..260] of integer;

type     elem=record
         x,y:integer;
end;

var      kk,n,h,i,j,k,x,y,c,m:longint;
         start,cd,viz:vect;
         t:array[0..1,1..600] of integer;
         vv:array[1..33000] of elem;
         v:array[1..10000] of integer;
         dist,a:array[1..256,1..256] of integer;
         bufin,bufout:array[1..66000] of byte;
         ok:boolean;

function pivot1(st,dr:integer):integer;
var      i,j,di,dj,au:integer;
         aux:elem;
begin
  i:=st; j:=dr; di:=0; dj:=1;
  while i<j do
    begin
      if dist[vv[i].x,vv[i].y]>dist[vv[j].x,vv[j].y] then
        begin
          aux:=vv[i];
          vv[i]:=vv[j];
          vv[j]:=aux;
          au:=di;
          di:=dj;
          dj:=au;
        end;
      i:=i+di;
      j:=j-dj;
    end;
  pivot1:=i;
end;


procedure sort1(st,dr:integer);
var     p:integer;
begin
  if st<dr then
    begin
      p:=pivot1(st,dr);
      sort1(st,p-1);
      sort1(p+1,dr);
    end;
end;

function pivot(st,dr:integer):integer;
var      i,j,di,dj,aux:integer;
begin
  i:=st; j:=dr; di:=0; dj:=1;
  while i<j do
    begin
      if v[i]>v[j] then
        begin
          aux:=v[i];
          v[i]:=v[j];
          v[j]:=aux;
          aux:=di;
          di:=dj;
          dj:=aux;
        end;
      i:=i+di;
      j:=j-dj;
    end;
  pivot:=i;
end;


procedure sort(st,dr:integer);
var     p:integer;
begin
  if st<dr then
    begin
      p:=pivot(st,dr);
      sort(st,p-1);
      sort(p+1,dr);
    end;
end;

procedure bfs(nod:integer);
var       p,st,sf,i,z:longint;
begin
  for i:=1 to n do
    viz[i]:=0;
  st:=0; sf:=1;
  cd[1]:=nod;
  while st<sf do
    begin
      st:=st+1;
      p:=start[cd[st]];
      z:=cd[st];
      while p<>0 do
        begin
          if viz[t[0,p]]=0 then
            begin
              viz[t[0,p]]:=1;
              inc(sf);
              cd[sf]:=t[0,p];
              if a[z,t[0,p]]>dist[nod,z] then dist[nod,t[0,p]]:=a[z,t[0,p]]
                else dist[nod,t[0,p]]:=dist[nod,z];
            end;
            p:=t[1,p];
        end;
    end;
end;

begin
  assign(input,'apm.in'); reset(input);
  assign(output,'apm.out'); rewrite(output);
  settextbuf(input,bufin);
  settextbuf(output,bufout);
  readln(n);
  kk:=0;
  for i:=1 to n-1 do
    begin
      readln(x,y,c);
      inc(kk);
      a[x,y]:=c; a[y,x]:=c;
      t[0,kk]:=y;
      t[1,kk]:=start[x];
      start[x]:=kk;
      inc(kk);
      t[0,kk]:=x;
      t[1,kk]:=start[y];
      start[y]:=kk;
    end;
  for i:=1 to n do
    bfs(i);
  k:=0;
  while not seekeof (input) do
    begin
      readln(c);
      inc(k);
      v[k]:=c;
    end;
  sort(1,k);
  m:=0;
  for i:=1 to n do
    for j:=i+1 to n do
      begin
        if a[i,j]=0 then
          begin
            inc(m);
            vv[m].x:=i; vv[m].y:=j;
          end;
      end;
  sort1(1,m);
  h:=1;
  ok:=false;
  for i:=1 to k do
    begin
      for j:=h to m do
        begin
          if dist[vv[j].x,vv[j].y]<=v[i] then
            begin
              writeln(vv[j].x,' ',vv[j].y,' ',v[i]);
              h:=j+1;
              ok:=true;
              break;
            end
          else break;
        end;
    end;
  if ok=false then writeln(0);
  close(input); close(output);
end.