Pagini recente » Cod sursa (job #1827959) | Cod sursa (job #1171801) | Cod sursa (job #2251516) | Cod sursa (job #2906213) | Cod sursa (job #845308)
Cod sursa(job #845308)
program algoritmul_dijkstra;
type lista=^celula;
celula=record
nod:longint;
cost:integer;
next:lista;
end;
var f1,f2:text;
n,m,a,b,c,min,pmin,i,x:longint;
ad:array [1..50000] of lista;
r,r2,coada:lista;
drum:array[1..50000] of longint;
v:array[1..50000] of byte;
begin
assign(f1,'dijkstra.in');
reset(f1);
assign(f2,'dijkstra.out');
rewrite(f2);
readln(f1,n,m);
for i:=1 to 50000 do begin new(ad[i]);ad[i]^.next:=nil; end;
for i:= 1 to m do
begin
readln(f1,a,b,c);
new(r);
r^.nod:=b;
r^.cost:=c;
r^.next:=ad[a]^.next;
ad[a]^.next:=r;
end;
for i:=2 to n do drum[i]:=2000000000;
x:=1; new(coada);
coada^.next:=nil;
new(r);
r^.nod:=1;
r^.next:=nil;v[1]:=1;
coada^.next:=r;
for i:=1 to n-1 do
begin
r:=ad[x]^.next;
while r<>nil do
begin
if v[r^.nod]<>2 then
if drum[x]+r^.cost<drum[r^.nod] then drum[r^.nod]:=drum[x]+r^.cost;
if v[r^.nod]=0 then
begin
v[r^.nod]:=1;
new(r2);
r2^.nod:=r^.nod;
r2^.next:=coada^.next;
coada^.next:=r2;
end;
r:=r^.next;
end;
r:=coada^.next; min:=2000000000;
while (r^.next^.nod<>x) do
begin
if drum[r^.nod]<min then begin min:=drum[r^.nod]; pmin:=r^.nod; end;
r:=r^.next;
end;
r^.next:=r^.next^.next;
while r<>nil do
begin
if drum[r^.nod]<min then begin min:=drum[r^.nod]; pmin:=r^.nod; end;
r:=r^.next;
end;
x:=pmin;
v[pmin]:=2;
end;
for i:=2 to n do write(f2,drum[i],' ');
close(f1);
close(f2);
end.