Cod sursa(job #1362928)

Utilizator mariusadamMarius Adam mariusadam Data 26 februarie 2015 16:50:53
Problema Ubuntzei Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.75 kb
program ubuntzei;
const inf=maxint;
type dist_min=array[1..10000] of longint;
     vizitat=array[1..10000] of 0..1;
var t:array[0..2,1..20000] of longint;
    start:array[1..10000] of integer;
    d:dist_min;
    cd:array[1..100000] of integer;
    viz:vizitat;
    fr:array[1..15] of integer;
    m,n,k:integer;
    f,g:text;

procedure citire;
var i,j,z,distanta:integer;
begin
 readln(f,n,m);
 read(f,k);
 for i:=1 to k do
  read(f,fr[i]);
 readln(f);
 for z:=1 to m do
  begin
   readln(f,i,j,distanta);
   t[0,z]:=j;
   t[1,z]:=start[j];
   t[2,z]:=distanta;
   start[i]:=z;
  end;
end;

procedure initialize(var d:dist_min;var viz:vizitat);
var i:integer;
begin
 for i:=1 to n do
  begin
   d[i]:=inf;
   viz[i]:=0;
  end;
end;

procedure bellman_ford(x:integer);
var sf,st,nod,p:longint;
begin
 st:=1; sf:=1;
 cd[st]:=x; d[x]:=0;
 while st<=sf do
  begin
   viz[cd[st]]:=0; nod:=cd[st];
   p:=start[nod];
   while p<>0 do
    begin
     if d[nod]+t[2,p]<d[t[0,p]] then
      d[t[0,p]]:=d[nod]+t[2,p];
     if viz[t[0,p]]=0 then
      begin
       viz[t[0,p]]:=1;
       sf:=sf+1;
       cd[sf]:=t[0,p];
      end;
     p:=t[1,p];
    end;
   st:=st+1;
  end;
end;


procedure solve;
var dmin,i:integer;
begin
 if k>0 then
  begin
   dmin:=0;
   bellman_ford(1);
   dmin:=d[fr[1]];
   initialize(d,viz);
   for i:=2 to k-1 do
    begin
      bellman_ford(fr[i]);
      dmin:=dmin+d[fr[i+1]];
      initialize(d,viz);
    end;
   bellman_ford(fr[k]);
   dmin:=dmin+d[n];
   writeln(g,dmin);
  end
 else
  begin
   bellman_ford(1);
   writeln(g,d[n]);
  end;
end;

begin
 assign(f,'ubuntzei.in'); reset(f);
 assign(g,'ubuntzei.out'); rewrite(g);
 citire;
 solve;
 close(f);
 close(g);
end.