Cod sursa(job #251759)

Utilizator valytgjiu91stancu vlad valytgjiu91 Data 3 februarie 2009 12:40:08
Problema Distante Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.42 kb
const inf=10000;
const nmax=10000;
var f,g:text;
ok:boolean;
c:array[1..nmax,1..nmax]of integer;
df,d,p:array[1..nmax]of longint;
s:array[1..nmax]of 0..1;
x1,x,y,min,n,i,m,j,k:longint;
i1,t:byte;
begin
assign(f,'distante.in');
reset(f);
assign(g,'distante.out');
rewrite(g);
readln(f,t);

for i1:=1 to t do
begin
   readln(f,n,m,x1);
   for i:=1 to n do
     read(f,df[i]);

   for i:=1 to n do
     for j:=1 to n do
       c[i,j]:=inf;
   for i:=1 to m do
     begin
      readln(f,x,y,k);
      c[x,y]:=k;
   end;
for i:=1 to n do
begin
d[i]:=c[x1,i];
if d[i]<>inf then p[i]:=x
              else p[i]:=0;
end;
s[x1]:=1;
p[x1]:=0;

repeat
   ok:=false;
   min:=inf;
   for i:=1 to n do
        if (s[i]=0) and(d[i]<min) then
           begin
           min:=d[i];
           y:=i;
           ok:=true;
           end;
   if ok then begin
        s[y]:=1;
        for i:=1 to n do
           if (s[i]=0) and (d[i]>d[y]+c[y,i]) then
                          begin
                            d[i]:=d[y]+c[y,i];
                            p[i]:=y;
                          end;
         end;
   until not ok;
   d[x1]:=0;
   ok:=true;
   for i:=1 to n do
     if d[i]<>df[i] then
                    begin
                      ok:=false;
                      break;
                      end;
     if ok then writeln(g,'DA')
        else writeln(g,'NU');
end;
close(g);
end.