Cod sursa(job #387556)

Utilizator potytzuPotinteu Minail potytzu Data 27 ianuarie 2010 21:40:04
Problema Distante Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.56 kb
program pascal;
var a:array[0..50000,0..50000] of 0..1000;
    s,d,d1:array[0..50000] of word;
    n,i,j,r,min,poz,m:longint;
    t,q:integer;
    f,g:text;

procedure citire;
var p,o,c:longint;
begin
   read(f,n,m,r);
   for i:=1 to n do
      read(f,d1[i]);
   for i:=1 to m do
      begin
         read(f,p,o,c);
         a[p,o]:=c;
         a[o,p]:=c;
      end;
end;

function identic:boolean;
begin
   identic:=true;
   for i:=1 to n do
      if d1[i]<>d[i] then
         begin
            identic:=false;
            break;
         end;
end;

begin
   assign(f,'distante.in');reset(f);
   assign(g,'distante.out');rewrite(g);
   read(f,t);
   for q:=1 to t do
      begin
         citire;
         s[r]:=1;
         for i:=1 to n do
            if (a[r,i]<>0)or(i=r) then
               d[i]:=a[r,i]
            else
               d[i]:=50000000;
         for i:=1 to n-1 do
            begin
               min:=50000000;
               for j:=1 to n do
                  if s[j]=0 then
                     if d[j]<min then
                        begin
                           min:=d[j];
                           poz:=j;
                        end;
               s[poz]:=1;
               for j:=1 to n do
                  if (s[j]=0)and(a[poz,j]<>0) then
                     if d[j]>d[poz]+a[poz,j] then
                        d[j]:=d[poz]+a[poz,j];
            end;
         if identic then
            writeln(g,'DA')
         else
            writeln(g,'NU');
      end;
   close(f);
   close(g);
end.