Cod sursa(job #24060)

Utilizator fogabFodor Gabor fogab Data 1 martie 2007 20:02:03
Problema Distante Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.55 kb
const inf=99000099;
type pe=^e;
     e=record
         c:integer;
         who:longint;
         kov:pe;
       end;
var f,f2:text;
    t,t2:byte;
    n,m,s,i,j,l1,l2:longint;
    a,l:array[1..50000] of pe;
    min,min2:array[1..50000] of longint;
    w:array[1..5000000] of word;
    h:pe;
begin
assign(f,'distante.in');
reset(f);
assign(f2,'distante.out');
rewrite(f2);
readln(f,t);
for t2:=1 to t do
  begin
    readln(f,n,m,s);
    for i:=1 to n do begin
                     read(f,min2[i]);
                     new(a[i]);
                     a[i]^.kov:=nil;
                     l[i]:=a[i];
                     end;
    for i:=1 to m do
      begin
        readln(f,l1,l2,j);
        new(h);
        h^.c:=j;
        h^.who:=l2;
        h^.kov:=nil;
        l[l1]^.kov:=h;
        l[l1]:=h;
        new(h);
        h^.c:=j;
        h^.who:=l1;
        h^.kov:=nil;
        l[l2]^.kov:=h;
        l[l2]:=h;
      end;
    l1:=1;
    w[1]:=s;
    l2:=2;
    for i:=1 to n do
      min[i]:=inf;
    min[s]:=0;
    while l1<>l2 do
      begin
        j:=w[l1];
        h:=a[j]^.kov;
        while h<>nil do begin
          if min[j]+h^.c<min[h^.who] then
             begin
               min[h^.who]:=min[j]+h^.c;
               w[l2]:=h^.who;
               inc(l2);
             end;
          h:=h^.kov;
          end;
        inc(l1);
      end;
    for i:=1 to n do
      if min[i]<>min2[i] then break;
    if i=n then writeln(f2,'DA')
       else writeln(f2,'NU');
  end;
close(f);

close(f2);
end.