Professional Documents
Culture Documents
Thuat Toan Dijkstra Tren Heap PDF
Thuat Toan Dijkstra Tren Heap PDF
Heap
3. Thut ton Dijkstra t chc trn cu trc Heap (tm k hiu l Dijkstra_Heap)
T chc Heap: Heap gm cc nt l cc nh i t do (cha c nh nhn ng i ngn
nht), vi kho l nhn ng i ngn nht t s n i l d[i]. Nt gc chnh l nh t do
c nhn d[i] nh nht. Mi ln ly nt gc ra c nh nhn ca n v sa nhn cho cc
nh t do khc th phi thc hin hai loi x l Heap nu (php cp nht v php loi
b gc).
Vy thut ton Dijkstra t chc trn Heap nh sau:
Cp nht nt 1 ca Heap (tng ng vi nt s c gi tr kho bng 0)
inc(c); {so snh nhn ca hai nt con, chn c l con c nhn nh hn}
if d[v]<=d[h[c]] then break; { dng khi nhn v khng vt qu nhn hai nt con}
h[r] := h[c]; {chuyn nt c s hiu l con ln nt c s hiu l cha}
sh[h[r]] := r; {xc nhn li s hiu trong heap ca nt mi chuyn ln}
r := c; {xc nhn cha mi qu trnh lp li}
end;
h[r] := v; {nh v c t vo v tr r cui cng bo m iu kin ca heap}
sh[v] := r; {xc nhn li s hiu ca nt v trong heap}
end;
procedure dijkstra;
var i,u,j,v,min : integer;
begin
capnhat(1); {to nt th nht cho heap}
repeat
u := lay; {u: nh cha c nh nhn, c nhn nh nht}
if u=t then break; {ti ch th dng}
dx[u] := True; {nh du u c c nh nhn}
for j:= p^[u]+1 to p^[1] do {j: ch s trong mng ke, ca cc nh k vi u}
begin
v := k[j]; {v k vi u}
if (not dx[v]) and (d[v]>d[u]+c^[j]) then {iu kin sa nhn v}
begin
d[v] := d[u] + c^[j]; {sa li nhn ca v}
tr[v] := u; {ghi nhn li nh trc ca v l u}
capnhat(v); {cp nht li v trong heap bo m cu trc heap }
end;
end;
until shmax = 0; {dng khi khng cn nh t do (s nt ca heap bng 0)}
end;
procedure inkq;
var f : text; i,j : integer;
kq : k3;
begin
assign(f,fo);
rewrite(f);
if d[t]=maxc then
writeln(f,-1) {ghi kt qu: v nghim}
else
begin
writeln(f,d[t]); {ghi di ng i ngn nht t nh s n nh t vo file output}
i := 0;
while t<>s do {ln ngc cc nh lin tip ca hnh trnh ngn nht lu vo mng kq}
begin
inc(i);
kq[i] := t;
t := tr[t];
end;
inc(i);
kq[i] := s;
for j:=i downto 1 do write(f,kq[j], ); {ghi hnh trnh vo file output}
end;
close(f);
end;
BEGIN
doc_inp;
khoitri;
dijkstra;
inkq;
END.