Cod sursa(job #140386)

Utilizator dascalu2Dascalu Andi FLorin dascalu2 Data 21 februarie 2008 20:28:02
Problema Sate Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.68 kb
type adresa=^nod;
     nod= record
          inf,dist:longint;
          adr:adresa;
          end;
var n,m,x,y,k,b,e,i,j:longint;
    vc:array[1..30000]of adresa;
    co:array[1..600000]of integer;
    d:array[1..600000] of longint;
    viz:array[1..30000]of boolean;
    q,p:adresa;
procedure citire;
var d:longint;
begin
     assign(input,'sate.in');
     reset(input);
     readln(n,m,x,y);
     for k:=1 to n do
     vc[k]:=nil;
     for k:=1 to m do
     begin
          read(i,j,d);
          new(q);
          q^.inf:=i;
          q^.dist:=d;
          q^.adr:=vc[j];
          vc[j]:=q;
          new(q);
          q^.inf:=j;
          q^.dist:=d;
          q^.adr:=vc[i];
          vc[i]:=q;
     end;
     close(input);
end;
procedure rezolva;
var ok:boolean;
begin
     co[1]:=x;
     ok:=true;
     b:=0;
     e:=1;
     while ok do
     begin
          b:=b+1;
          p:=vc[co[b]];
          while(p<>nil)do
          begin
               if(viz[p^.inf]=false)then
               begin
                    e:=e+1;
                    if (p^.inf>co[b]) then
                       d[e]:=d[b]+p^.dist
                    else
                       d[e]:=d[b]-p^.dist;
                    co[e]:=p^.inf;
                    if(p^.inf=y)then
                    begin
                         ok:=false;
                         break;
                    end;
               end;
               p:=p^.adr;
          end;
          viz[co[b]]:=true;
     end;
end;
procedure afisare;
begin
     assign(output,'sate.out');
     rewrite(output);
     writeln(d[e]);
     close(output);
end;

begin
citire;
rezolva;
afisare;
end.