Cod sursa(job #392922)

Utilizator m3rlynBec Bogdan m3rlyn Data 8 februarie 2010 16:18:05
Problema Distante Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.62 kb
program pas;
type el=^longint;
var a:array[1..50000,1..50000] of el;
    i,j,k,t,m,n,r:longint;
    sol,d:array[1..50000] of el;
    s:array[1..50000] of integer;
    f,g:text;
    ok:boolean;

procedure citire;
var x,y,z:longint;
    i,j:longint;
begin
    readln(f,n,m,r);
    For i:=1 to n do
     begin
      new(sol[i]);
      new(d[i]);
      read(f,sol[i]^);
     end;
    readln(f);
    For i:=1 to m do
     begin
      readln(f,x,y,z);
      new(a[x,y]);
      new(a[y,x]);
      a[x,y]^:=z;
      a[y,x]^:=z;
     end;
end;

procedure djk;
var i,j,min,p:longint;
begin
    For i:=1 to n do
     begin
      new(d[i]);
      If a[r,i]<>nil then
       d[i]^:=a[r,i]^
      else
       d[i]^:=maxlongint;
     end;
    d[r]^:=maxlongint;
    s[r]:=1;
    For i:=1 to n-1 do
     begin
      min:=maxlongint;
      For j:=1 to n do
       If s[j]=0 then
        If d[j]^<min then
         begin
          min:=d[j]^;
          p:=j;
         end;
      s[p]:=1;
      For j:=1 to n do
       If s[j]=0 then
        If a[p,j]<>nil then
         If d[j]^>d[p]^+a[p,j]^ then
          d[j]^:=d[p]^+a[p,j]^
    end;


end;

begin
    assign(f,'distante.in');
    reset(f);
    assign(g,'distante.out');
    rewrite(g);
    readln(f,t);
    For i:=1 to t do
     begin
      citire;
      djk;
      ok:=true;
      d[r]^:=0;
      For j:=1 to n do
       If sol[j]^<>d[j]^ then
        begin
         ok:=false;
         break;
        end;
      If ok then
       writeln(g,'DA')
      else
       writeln(g,'NU');
     end;
     close(f);
     close(g);
end.