Cod sursa(job #186593)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 28 aprilie 2008 13:30:28
Problema PScNv Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.14 kb
const inf = 1001;

type pelem = ^elem;
     elem = record
       info, cost : integer;
       next : pelem;
     end;

var fi, fo : text;
    n, m, ns, nf, i, j, k, c, min : integer;
    v : array[1..250000]of pelem;
    d, H, poz : array[1..250000]of integer;
    p : pelem;

procedure down(i,n:integer);
var fiu,tata,v:integer;
begin
  tata:=i; fiu:=i shl 1; v:=H[i];
  while fiu<=n do
    begin
      if fiu<n then
        if d[H[fiu]]>d[H[fiu+1]] then inc(fiu);
      if d[v]>d[H[fiu]] then
        begin
          H[tata]:=H[fiu];
          poz[H[fiu]]:=tata;
          tata:=fiu;
          fiu:=fiu shl 1;
        end
      else fiu:=n+1;
    end;
  H[tata]:=v;
  poz[v]:=tata;
end;

procedure up(i,n:integer);
var tata,fiu,aux:integer;
begin
  fiu:=i; tata:=fiu shr 1;
  while (tata<>0)and(d[H[tata]]>D[H[fiu]]) do
    begin
      aux:=H[fiu];
      H[fiu]:=H[tata];
      poz[H[tata]]:=fiu;
      H[tata]:=aux;
      poz[aux]:=tata;
      fiu:=tata;
      tata:=fiu shr 1;
    end;
end;

begin
  assign(fi,'pscnv.in');  reset(fi);
  assign(fo,'pscnv.out'); rewrite(fo);
  read(fi,n,m,ns,nf);
  for i:=1 to m do
    begin
      read(fi,j,k,c);
      new(p);
      p^.info:=k;
      p^.cost:=c;
      p^.next:=v[j];
      v[j]:=p;
    end;
  for i:=1 to n do
    begin
      d[i]:=inf;
      H[i]:=i;
      poz[i]:=1;
    end;
  p:=v[ns];
  while p<>nil do
    begin
      d[p^.info]:=p^.cost;
      p:=p^.next;
    end;
  d[ns]:=inf+1;
  for i:=n shr 1 downto 1 do
    down(i,n);
  while n>2 do
    begin
      min:=H[1];
      H[1]:=H[n];
      dec(n);
      down(1,n);
      p:=v[min];
      while p<>nil do
        begin
          if d[min]>p^.cost then
            if d[p^.info]>d[min] then
              begin
                d[p^.info]:=d[min];
                up(poz[p^.info],n);
              end;
          if d[min]<=p^.cost then
            if d[p^.info]>p^.cost then
              begin
                d[p^.info]:=p^.cost;
                up(poz[p^.info],n);
              end;
          p:=p^.next;
      end;
  end;
  writeln(fo,d[nf]);
  close(fi);
  close(fo);
end.