Cod sursa(job #1036813)

Utilizator vyrtusRadu Criuleni vyrtus Data 19 noiembrie 2013 17:23:30
Problema Sate Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.69 kb
Program satele_distanta;
  type drum=record
          x,y:integer; d:longint;
           end;

           rezul=record
             p:integer; k:longint;
              end;
  var
    a:array[1..100024] of drum;
    parcurs:array[1..100024] of boolean;
    rez:array[1..30001] of rezul;
    val:array[1..30001] of longint;

  i,n,m,xi,xf,l,r:integer; f,g:text;

    begin
     assign(f,'sate.in'); reset(f);
       read(f,n,m,xi,xf);
        for i:=1 to m do
         begin
         read(f,a[i].x,a[i].y,a[i].d);
          parcurs[i]:=true;
          end;
         close(f);

    for i:=1 to n do
      val[i]:=0;

   l:=1; r:=2;
    rez[l].p:=xi; rez[l].k:=0; val[xi]:=0;
     while val[xf]=0 do
      begin
           for i:=1 to m do
            if parcurs[i] then
             begin

               if a[i].x=rez[l].p then
                 begin parcurs[i]:=false;
                  if val[a[i].y]=0 then  begin
                     rez[r].p:=a[i].y;
if a[i].y<rez[l].p then rez[r].k:=rez[l].k+a[i].d else rez[r].k:=rez[l].k-a[i].d;
                     val[a[i].y]:=rez[r].k;
                     inc(r);     end;
                  end;

               if a[i].y=rez[l].p then
                 begin parcurs[i]:=false;
                  if val[a[i].x]=0 then  begin
                     rez[r].p:=a[i].x;
if a[i].x<rez[l].p then rez[r].k:=rez[l].k+a[i].d else rez[r].k:=rez[l].k-a[i].d;
                     val[a[i].x]:=rez[r].k;
                     inc(r);     end;
                  end;
               break;
             end;
        inc(l);
      end;

     assign(g,'sate.out');
     rewrite(g);
     writeln(g,abs(val[xf]));
     close(g);

     end.