Cod sursa(job #342237)

Utilizator ionutz32Ilie Ionut ionutz32 Data 20 august 2009 22:52:47
Problema Sate Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.05 kb
type ref=^nod;
nod=record
    nr:longint;
    adr:ref;
    end;
ref2=^nod2;
nod2=record
     nr,dist:longint;
     adr:ref2;
     end;
var a:array[1..30000] of ref2;
s:array[1..30000] of 0..1;
v,sf,u2,cost,cost2:ref;
u:ref2;
n,m,x,y,i,j,k,c:longint;
f,g:text;
ok:boolean;
begin
assign(f,'sate.in');
assign(g,'sate.out');
reset(f);rewrite(g);
readln(f,n,m,x,y);
for i:=1 to m do
    begin
    readln(f,j,k,c);
    if a[j]=nil then
       begin
       new(a[j]);
       a[j]^.nr:=k;
       a[j]^.dist:=c;
       a[j]^.adr:=nil;
       end
    else
        begin
        new(u);
        u^.nr:=k;
        u^.adr:=a[j];
        u^.dist:=c;
        a[j]:=u;
        end;
    if a[k]=nil then
       begin
       new(a[k]);
       a[k]^.nr:=j;
       a[k]^.dist:=c;
       a[k]^.adr:=nil;
       end
    else
        begin
        new(u);
        u^.nr:=j;
        u^.adr:=a[k];
        u^.dist:=c;
        a[k]:=u;
        end;
    end;
new(v);
v^.nr:=x;
v^.adr:=nil;
s[x]:=1;
sf:=v;
new(cost);
cost^.nr:=0;
cost^.adr:=nil;
cost2:=cost;
repeat
      u:=a[v^.nr];
      while u<>nil do
            begin
            if s[u^.nr]=0 then
               begin
               s[u^.nr]:=1;
               new(u2);
               u2^.nr:=u^.nr;
               u2^.adr:=nil;
               sf^.adr:=u2;
               sf:=u2;
               new(u2);
               if v^.nr<u^.nr then
                  u2^.nr:=cost^.nr+u^.dist
               else
                   u2^.nr:=cost^.nr-u^.dist;
               u2^.adr:=nil;
               cost2^.adr:=u2;
               cost2:=u2;
               if u^.nr=y then
                  begin
                  ok:=true;
                  break;
                  end;
               end;
            u:=u^.adr;
            end;
      if ok=false then
         begin
         u2:=v^.adr;
         dispose(v);
         v:=u2;
         u2:=cost^.adr;
         dispose(cost);
         cost:=u2;
         end;
until ok=true;
write(g,cost2^.nr);
close(f);close(g);
end.