Cod sursa(job #1365627)

Utilizator mihai1996Toader Mihai mihai1996 Data 28 februarie 2015 13:47:59
Problema Distante Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.97 kb
program distante;
const inf=maxlongint;
var d,di,start:array[1..50000] of longint;
    viz:array[1..50000] of 0..1;
    cd:array[1..200000] of longint;
    t:array[0..2,1..200000] of longint;
    st,sf,i,j,n,m,s,k,opt,ii,x,y,z,p:longint;
    ok:boolean;
    bufin,bufout:array[1..200000] of byte;


begin
  assign(input,'distante.in'); reset(input);
  assign(output,'distante.out'); rewrite(output);
  settextbuf(input,bufin);
  settextbuf(output,bufout);
  readln(opt);

  for ii:=1 to opt do
    begin
      readln(n,m,s);
      for i:=1 to n do
        read(di[i]);
      k:=0;
      for i:=1 to m do
         begin
           readln(x,y,z);
           inc(k);
           t[0,k]:=y;
           t[1,k]:=start[x];
           start[x]:=k;
           t[2,k]:=z;
           inc(k);
           t[0,k]:=x;
           t[1,k]:=start[y];
           start[y]:=k;
           t[2,k]:=z;
         end;
      for i:=1 to n do
        d[i]:=inf;
      d[s]:=0;
      cd[1]:=s;
      st:=1;
      sf:=1;
      viz[cd[st]]:=1;
      while st<=sf do
        begin
          p:=start[cd[st]];
        //  viz[cd[st]]:=0;
          while p<>0 do
            begin
              if d[t[0,p]]>d[cd[st]]+t[2,p] then
                begin
                   d[t[0,p]]:=d[cd[st]]+t[2,p];
                   if viz[t[0,p]]=0 then
                     begin
                       inc(sf);
                       cd[sf]:=t[0,p];
                       viz[t[0,p]]:=1;
                     end;
                end;

              p:=t[1,p];
            end;
           inc(st);
        end;
        ok:=true;
      for i:=1 to n do
        if di[i]<>d[i] then
          begin
           ok:=false;
           break;
          end;
      if ok then
        writeln('DA')
          else
        writeln('NU');
      for i:=1 to n do
        begin
          viz[i]:=0;
          start[i]:=0;
        end;

    end;
  close(input); close(output);
end.