Cod sursa(job #133619)

Utilizator you_reheroMihai Gojinetchi you_rehero Data 9 februarie 2008 11:05:19
Problema Sate Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.67 kb
type pelem=^elem;
     elem=record
       info:integer;
       next:pelem;
     end;
var fi,fo:text;
    sat,dist:array[1..100025]of pelem;
    n,m,i,j,x,y,d,varf1,varf2,first,last:longint;
    s:array[1..30000]of byte;
    distanta:array[1..30000]of longint;
    coada:array[1..31000]of integer;
procedure push(var first:pelem; vl:longint);
var p:pelem;
begin
  new(p);
  p^.info:=vl;
  p^.next:=first;
  first:=p;
end;
procedure pop(var first:pelem; var vl:longint);
var p:pelem;
begin
  vl:=first^.info;
  p:=first;
  first:=first^.next;
  dispose(p);
end;
procedure qin(vl:longint);
begin
  coada[last]:=vl;
  inc(last);
end;
procedure qout(var vl:longint);
begin
  vl:=coada[first];
  inc(first);
end;
procedure bf(start:integer);
var nod,varf,lung:longint;
begin
  s[start]:=1;
  qin(start);
  while first<>last do
    begin
      qout(nod);
      while sat[nod]<>nil do
        begin
          pop(sat[nod],varf);
          pop(dist[nod],lung);
          if s[varf]=0 then
            begin
              s[varf]:=1;
              qin(varf);
              if nod<varf then distanta[varf]:=distanta[nod]+lung
                          else distanta[varf]:=distanta[nod]-lung;
              if varf=y then exit;
            end;
        end;
    end;
end;
begin
  assign(fi,'sate.in'); reset(fi);
  assign(fo,'sate.out'); rewrite(fo);
  read(fi,n,m,x,y);
  for i:=1 to m do
    begin
      read(fi,varf1,varf2,d);
      push(sat[varf1],varf2);
      push(dist[varf1],d);
      push(sat[varf2],varf1);
      push(dist[varf2],d);
    end;
  first:=1; last:=1;
  bf(x);
  writeln(fo,abs(distanta[y]));
  close(fi);
  close(fo);
end.