Pagini recente » Cod sursa (job #1890095) | Cod sursa (job #1533192) | Cod sursa (job #229862) | Cod sursa (job #600566) | Cod sursa (job #159971)
Cod sursa(job #159971)
type point=^nod;
nod=record
nr,d:word;
ua:point;
end;
loch=record
d,p:longint;
end;
var f1,f2:text;
i,n,m,g,t,f,c,dh,min,lc,cn,ds:longint;
p:point;
l:array[0..50010] of point;
d:array[0..50010] of loch;
hp:array[0..50010] of word;
procedure swap(i,j:longint);
var aux:longint;
begin
aux:=hp[i];
hp[i]:=hp[j];
hp[j]:=aux;
d[hp[j]].p:=j;
d[hp[i]].p:=i;
end;
procedure clad(t,f,c:longint);
begin
new(p);
p^.nr:=f;
p^.d:=c;
p^.ua:=l[t];
l[t]:=p;
end;
procedure heapup(i:longint);
begin
if i>1 then
if d[hp[i div 2]].d>d[hp[i]].d then
begin
swap(i,i div 2);
heapup(i div 2);
end;
end;
procedure heapdown(i,n:longint);
var f:longint;
begin
if 2*i<=dh then
begin
f:=2*i;
if (2*i+1<=dh)and(d[hp[2*i+1]].d<d[hp[2*i]].d) then
inc(f);
if d[hp[i]].d>d[hp[f]].d then
begin
swap(i,f);
heapdown(f,n);
end;
end;
end;
begin
assign(f1,'dijkstra.in');
reset(f1);
assign(f2,'dijkstra.out');
rewrite(f2);
read(f1,n,m);
for i:=1 to m do
begin
read(f1,t,f,c);
clad(t,f,c);
end;
for i:=2 to n do
d[i].d:=maxint;
p:=l[1];
dh:=0;
while p<>nil do
begin
inc(dh);
d[p^.nr].d:=p^.d;
d[p^.nr].p:=dh;
hp[dh]:=p^.nr;
heapup(dh);
p:=p^.ua;
end;
for g:=1 to n-1 do
begin
min:=hp[1];
p:=l[min];
cn:=d[hp[1]].d;
hp[1]:=0;
while p<>nil do
begin
lc:=p^.nr;
ds:=p^.d;
if d[lc].d>cn+ds then
begin
d[lc].d:=cn+ds;
if d[lc].p=0 then
begin
inc(dh);
hp[dh]:=lc;
d[lc].p:=dh;
end;
heapup(d[lc].p);
end;
p:=p^.ua;
end;
hp[1]:=hp[dh];
d[hp[1]].p:=1;
dec(dh);
heapdown(1,dh);
end;
for i:=2 to n do
if d[i].d<>maxint then
write(f2,d[i].d,' ')
else write(f2,0,' ');
close(f1);
close(f2);
end.