Cod sursa(job #271245)

Utilizator valytgjiu91stancu vlad valytgjiu91 Data 5 martie 2009 00:40:16
Problema Distante Scor 40
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.5 kb
const inf=1000000;
const nmax=50000;
type muchie=record
                 x,y,cost:longint;
                 end;
var f,h:text;
ok:boolean;
g:array[1..2*nmax] of muchie;
df,d,p:array[1..nmax]of longint;
s:array[1..nmax]of 0..1;
c,x1,x,y,min,n,i,m,j,k:longint;
i1,t:byte;

begin
assign(f,'distante.in');
reset(f);
assign(h,'distante.out');
rewrite(h);
readln(f,t);
for i:=1 to nmax do
  d[i]:=inf;

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 m do
      begin
        read(f,x,y,c);
        g[i].x:=x;
        g[i].y:=y;
        g[i].cost:=c;
        if x=x1 then d[y]:=c;
        if y=x1 then d[x]:=c;
      end;
     d[x1]:=0;
     repeat
       ok:=true;
       for i:=1 to m do
         begin
         if d[g[i].y]>(d[g[i].x]+g[i].cost) then
                begin
                  d[g[i].y]:=d[g[i].x]+g[i].cost;
                  ok:=false;
                end;
          if d[g[i].x]>(d[g[i].y]+g[i].cost) then
                begin
                  d[g[i].x]:=d[g[i].y]+g[i].cost;
                  ok:=false;
                end;
          end;
      until ok;

    for i:=1 to n do
      if d[i]=inf then d[i]:=0;
    for i:=1 to n do
     if (d[i]<>df[i]) then
                    begin
                      ok:=false;
                      break;
                      end;
     if ok then writeln(h,'DA')
           else writeln(h,'NU');
     for i:=1 to n do
       d[i]:=inf;
end;
close(h);
end.