Cod sursa(job #699545)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 29 februarie 2012 20:03:52
Problema Distante Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.42 kb
type muchie=^nod;
     nod=record c, n:longint; a:muchie; end;

var v:array [1..10, 1..50000] of muchie;
    r:array [1..50000] of longint;
    ver:array[1..50000] of longint;
    q:array [0..50000] of longint;
    viz:array [1..50000] of boolean;
    p:muchie;
    i, j, n, m, a, b, x, y, z, t, s, ii:longint;
    f, g:text;
    buf1, buf2:array [1.. 1 shl 17] of char;

begin
assign (f, 'distante.in'); settextbuf (f, buf1); reset (f);
assign (g, 'distante.out'); settextbuf (g, buf2); rewrite (g);

read (f, t);
for ii := 1 to t do
  begin
  read (f, n, m, s);
  r[s]:=0;
  for i := 1 to n do viz[i]:=false;

  for i := 1 to n do read (f, ver[i]);

  for i := 1 to m do
    begin
    read (f, x, y, z);
    new (p); p^.n:=y; p^.c:=z; p^.a:=v[ii, x]; v[ii, x]:=p;
    new (p); p^.n:=x; p^.c:=z; p^.a:=v[ii, y]; v[ii, y]:=p;
    end;

  a:=1; b:=1; q[1]:=s;

  if ver[s]=0 then viz[s]:=true else begin a:=2; r[s]:=1; end;

  while a<=b do
    begin
    x:=q[a];
    p:=v[ii, x];
    while p <> nil do
      begin
      if (r[x]+p^.c=ver[p^.n]) and (viz[p^.n]=false) then
        begin
        r[p^.n]:=ver[p^.n];
        viz[p^.n]:=true;
        inc (b);
        q[b]:=p^.n;
        end;
      p:=p^.a;
      end;
    inc (a);
    end;

  t:=0;
  for i := 1 to n do if viz[i]=true then inc (t);
  if t=n then writeln (g, 'DA') else writeln (g, 'NU');
  end;

close (f); close (g);
end.