Cod sursa(job #266950)

Utilizator TecoVacaretu Daniel Teco Data 26 februarie 2009 13:15:21
Problema Distante Scor 40
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.51 kb
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V+,X+}
{$M 16384,0,655360}
type muchie=record
            x,y,cost:longint;
            end;
const q=2000000000;
var v:array[1..50001]of muchie;
    d,tz:array[1..100001]of longint;
    f,g:text;
    t:byte;
    n,poz,pozz,xp,z,m,i,s:longint;
    modif:boolean;

procedure init;
begin
for i:=1 to n do d[i]:=q;
for i:=1 to m do begin
    read(f,v[i].x,v[i].y,v[i].cost);
    if v[i].x=xp then d[v[i].y]:=v[i].cost;
end;
d[xp]:=0;
end;

procedure bellford;
begin
repeat
modif:=false;
for i:=1 to m do begin
          s:=d[v[i].x]+v[i].cost;
          if s<d[v[i].y] then begin
                           d[v[i].y]:=s;
                           modif:=true;
                           end;
          s:=d[v[i].y]+v[i].cost;
          if s<d[v[i].x] then begin
                          d[v[i].x]:=s;
                          modif:=true;
                          end;

          end;
until not modif;
end;

function verif:boolean;
var ok:boolean;
begin
ok:=true;
for i:=1 to n do if d[i]<>tz[i] then begin
                                     ok:=false;
                                     break;
                                     end;
verif:=ok;
end;

begin
assign(f,'distante.in');reset(f);
assign(g,'distante.out');rewrite(g);
read(f,t);
for z:=1 to t do begin
    read(f,n,m,xp);
    for i:=1 to n do read(f,tz[i]);
    init;
    bellford;
    if verif then writeln(g,'DA')
             else writeln(g,'NU');
end;
close(g);
end.