Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

Thut ton Dijkstra trn cu trc

Heap

1. Nhc li thut ton Dijkstra tm ng


i ngn nht
Bi ton: Cho th c hng vi trng s cc cung (i,j) l C[i,j] khng m, tm ng
i ngn nht t nh s n nh t.
Thut ton Dijkstra:
Bc 1- Khi tr:
- Khi tr nhn ng i ngn nht t nh s ti nh i l d[i]:= C[s,i] (nu khng c
ng i trc tip t s n i th C[s,i] bng v cng). Lu li nh trc khi ti i trn
hnh trnh ngn nht l Tr[i] := s
- Khi tr nhn nh s l d[s] =0
- nh du mi nh i l t do (nhn d[i] cha ti u): DX[i]:=false
Bc 2 (vng lp v hn):
- Tm nh i0 t do c nhn d[i0] nh nht.
- Nu khng tm c i0 (i0 =0) hoc i0 =t th thot khi vng lp cn khng th
+ nh du i0 c c nh nhn DX[i0]:=True (gi i0 l nh c c nh nhn)
+ Sa nhn cho cc nh j t do k vi i0 theo cng thc d[j] = Min{d[j], d[i0]+C[i0,j] v
ghi lu li nh trc j l i0: Tr[j]:= i0
Bc 3 &minus Tm v ghi kt qu:
Da vo gi tr d[t] v mng Tr kt lun thch hp
2. Cu trc Heap v mt s php x l trn Heap
a) M t Heap: Heap c m t nh mt cy nh phn c cu trc sao cho gi tr kho
mi nt khng vt qu gi tr kho ca hai nt con ca n (suy ra gi tr kho ti gc
Heap l nh nht).
b) Hai php x l trn Heap
- Php cp nht Heap
Vn : Gi s nt v c gi tr kho nh i, cn chuyn nt v n v tr mi trn Heap
bo ton cu trc Heap
Gii quyt:
+ Nu nt v cha c trong Heap th to thm nt v thnh nt cui cng ca Heap (hnh 1)
+ Chuyn nt v t v tr hin ti n v tr thch hp bng cch tm ng i ngc t v
tr hin ti ca v v pha gc qua cc nt cha c gi tr kho ln hn gi tr kho ca v.
Trn ng i y dn nt cha xung nt con, nt cha cui cng chnh l v tr mi
ca nt v (hnh 2).
Ch : trn cy nh phn, nu nh s cc nt t gc n l v t con tri sang con phi
th d thy: khi bit s hiu ca nt cha l i c th suy ra s hiu hai nt con l 2*i v
2*i+1, ngc li s hiu nt con l j th s hiu nt cha l j div 2.

- Php loi b gc ca Heap


Vn : Gi s cn loi b nt gc khi Heap, hy sp xp li Heap (gi l php vun
ng)
Gii quyt:
+ Tm ng i t gc v pha l, i qua cc nt con c gi tr kho nh hn trong hai nt
con cho n khi gp l.
+ Trn dc ng i y, ko nt con ln v tr nt cha ca n.
V d trong hnh v 2 nu b nt gc c kho bng 1, ta s ko nt con ln v tr nt cha
trn ng i qua cc nt c gi tr kho l 1, 2, 6, 8 v Heap mi nh hnh 3

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)

Vng lp cho n khi Heap rng (khng cn nt no)


Begin
+ Ly nh u ti nt gc ca Heap (php loi b gc Heap)
+ Nu u= t th thot khi vng lp
+ nh du u l nh c c nh nhn
+ Duyt danh sch cung k tm cc cung c nh u bng u, nh cui l v
Nu v l nh t do v d[v] > d[u] + khong cch (u,v) th
Begin
Sa nhn cho v v ghi nhn nh trc v l u
Trn Heap, cp nht li nt tng ng vi nh v.
End;
End;
4. nh gi
+ Thut ton Dijkstra t chc nh nu mc 1. C phc tp thut ton l O(N2), nn
khng th thc hin trn th c nhiu nh.
+ Cc php x l Heap nu (cp nht Heap v loi b gc Heap) cn thc hin khng
qu 2.lgM php so snh (nu Heap c M nt). S M ti a l N (s nh ca th) v
ngy cng nh dn (ti 0). Ngoi ra, nu th tha (s cung t) th thao tc tm nh v k
vi nh u l khng ng k khi ta t chc danh sch cc cung k ny theo tng on c
nh u ging nhau (dng Forward Star). Do trn th tha, phc tp ca
Dijkstra_Heap c th t ti O(N. k.lgN) trong k khng ng k so vi N
+ Kt lun: Trn th nhiu nh t cung th Dijkstra_Heap l thc hin c trong thi
gian c th chp nhn.
5. Chng trnh
uses crt;
const maxN = 5001;
maxM = 10001;
maxC = 1000000000;
fi = &rquo;minpath.in&rquo;;
fo = &rquo;minpath.out&rquo;;
type k1 = array[1..maxM] of integer;
k2 = array[1..maxM] of longint;
k3 = array[1..maxN] of integer;
k4 = array[1..maxN] of longint;
k5 = array[1..maxN] of boolean;
var ke : ^k1; {danh sch nh k}
c : ^k2; {trng s cung tng ng vi danh sch k}
p : ^k3; 1 {v tr nh k trong danh sch k}
d : k4; {nhn ng i ngn nht trong thut ton Dijkstra}
tr : k3; {lu nh trc ca cc nh trong hnh trnh ngn nht }

dx : k5; {nh du nhn c nh, khng sa n}


h, {heap (ng)}
sh : k3; {s hiu ca nt trong heap}
n,m,s,t, {s nh, s cnh, nh xut pht v nh ch}
shmax : integer; {s nt max trn heap}
procedure doc_inp;
var i,u,v,x : integer;
f : text;
begin
assign(f,fi);
{c file input ln th nht}
reset(f);
readln(f,n,m,s,t);
new(p);
new(ke);
new(c);
fillchar(p^,sizeof(p^),0);
for i:=1 to m do
begin
readln(f,u);
inc(p^[u]); {p^[u] s lng nh k vi nh u}
end;
for i:=2 to n do
p^[i] := p^[i] + p^[i-1]; {p[i]^ dng xy dng ch s ca mng k}
close(f); {p[i]^ l v tr cui cng ca nh k vi nh i trong mng k}
{c file input ln th hai}
reset(f);
readln(f);
for i:=1 to m do
begin
readln(f,u,v,x);
k[p^[u]] := v; {xc nhn k vi nh u l nh v}
c^[p^[u]] := x; {xc nhn trng s ca cung (u,v) l x}
dec(p^[u]); {chuyn v v tr ca nh k tip theo ca u}
end;
p^[n+1] := m; {hng ro}
close(f);
end;
procedure khoitri;
var i : integer;
begin

for i:=1 to n do d[i] := maxC; {nhn di ng i ngn nht t s ti i l v cng}


d[s] := 0; {nhn di ng i ngn nht t s ti s l 0}
fillchar(dx,sizeof(dx),False); {khi tr mng nh du: mi nh cha c nh nhn }
fillchar(sh,sizeof(sh),0); {khi tr s hiu cc nt ca Heap l 0}
shmax := 0; {khi tr s nt ca heap l 0}
end;
procedure capnhat(v : integer);
{nh v va nhn gi tr mi l d[v], do cn xp li v tr ca nh v trong heap, bo
m tnh cht heap}
var cha,con : integer;
begin
con := sh[v]; {con l s hiu nt hin ti ca v}
if con=0 then {v cha c trong heap, th b sung vo nt cui cng ca heap}
begin
inc(shmax);
con := shmax;
end;
cha := con div 2; {cha l s hiu hin ti ca nt cha ca nt v hin ti}
while (cha>0) and (d[h[cha]] > d[v]) do
{nu nhn ca nt cha (c s hiu l cha) ln hn nhn ca nt v th a dn nt v v
pha gc ti v tr tho mn iu kin ca heap bng cch: ko nt cha xung v tr ca
nt con ca n }
begin
h[con] := h[cha];
sh[h[con]] := con;
con := cha;
cha := con div 2;
end;
h[con] := v; {nt con cui cng trong qu trnh "ko xung" nu trn, l v tr mi ca v}
sh[v] := con;
end;
function lay: integer;
{ly khi heap nh gc, vun li heap hai cy con hp thnh heap mi}
var r,c,v : integer;
begin
lay := h[1]; {ly ra nt gc l nt c nhn nh nht trong cc nt cha c nh nhn}
v := h[shmax]; {v: nh cui cng ca heap}
dec(shmax); {sau khi loi nh gc, s nt ca heap gim i 1}
r := 1; {bt u vun t nt gc}
while r*2 <= shmax do {qu trnh vun heap}
begin
c := r*2; {s hiu nt con tri ca r}
if (c

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.

You might also like