Cod sursa(job #186733)

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

type graf=^elem;
     elem=record
       info, cost : longint;
       next : graf;
     end;
     lista=^list;
     list=record
       info : longint;
       next : lista;
     end;

var fi,fo : text;
    n, m, ns, nf, i, j, k, tr : longint;
    d : Array[1..250000]of longint;
    v : Array[1..250000]of graf;
    l : Array[0..1000]of lista;
    p : graf;
    q, f : lista;

begin
  assign(fi,'pscnv.in'); reset(fi);
  assign(fo,'pscnv.out'); rewrite(fo);
  read(fi,n,m,ns,nf);
  for tr:=1 to m do
    begin
      read(fi,i,j,k);
      new(p);
      p^.info:=j;
      p^.cost:=k;
      p^.next:=v[i];
      v[i]:=p;
    end;
  for i:=1 to n do
    d[i]:=inf;
  d[ns]:=0;
  new(q);
  q^.info:=ns;
  q^.next:=l[0];
  l[0]:=q;
  for i:=0 to 1000 do
    begin
      q:=l[i];
      while q<>nil do
        begin
          if d[q^.info]=i then
            begin
              p:=v[q^.info];
              while p<>nil do
                begin
                  if d[q^.info]>p^.cost then
                    if d[p^.info]>d[q^.info] then
                      begin
                        new(f);
                        f^.info:=p^.info;
                        f^.next:=l[d[q^.info]];
                        l[d[q^.info]]:=f;
                        d[p^.info]:=d[q^.info];
                      end;
                  if p^.cost>=d[q^.info] then
                    if d[p^.info]>p^.cost then
                      begin
                        new(f);
                        f^.info:=p^.info;
                        f^.next:=l[p^.cost];
                        l[p^.cost]:=f;
                        d[p^.info]:=p^.cost;
                      end;
                  p:=p^.next;
                end;
            end;
          q:=q^.next;
        end;
    end;
  writeln(fo,d[nf]);
  close(fi);
  close(fo);
end.