07b6e3d3 6727 489d A0c5 C81f5f24daa1ly Thuyet Do Thi Le Minh Hoang

You might also like

You are on page 1of 120

L thuyt th

\1[

MC LC
0. M U .......................................................................................................................................... 3
1. CC KHI NIM C BN.............................................................................................................. 4
I. NH NGHA TH (GRAPH) ..................................................................................................................4
II. CC KHI NIM..........................................................................................................................................5
2. BIU DIN TH TRN MY TNH............................................................................................ 6
I. MA TRN LIN K (MA TRN K) ..........................................................................................................6
II. DANH SCH CNH.....................................................................................................................................7
III. DANH SCH K .........................................................................................................................................7
IV. NHN XT...................................................................................................................................................8
3. CC THUT TON TM KIM TRN TH ............................................................................. 10
I. BI TON.....................................................................................................................................................10
II. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)..........................................11
III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)...............................16
IV. PHC TP TNH TON CA BFS V DFS...................................................................................21
4. TNH LIN THNG CA TH ................................................................................................. 22
I. NH NGHA................................................................................................................................................22
II. TNH LIN THNG TRONG TH V HNG................................................................................23
III. TH Y V THUT TON WARSHALL ..............................................................................23
IV. CC THNH PHN LIN THNG MNH...........................................................................................26
5. VI NG DNG CA CC THUT TON TM KIM TRN TH ........................................ 36
I. XY DNG CY KHUNG CA TH .................................................................................................36
II. TP CC CHU TRNH C BN CA TH.......................................................................................38
III. NH CHIU TH V BI TON LIT K CU...........................................................................39
IV. LIT K KHP..........................................................................................................................................44
I. BI TON 7 CI CU ................................................................................................................................47
II. NH NGHA...............................................................................................................................................47
III. NH L.....................................................................................................................................................47
IV. THUT TON FLEURY TM CHU TRNH EULER .............................................................................48
V. CI T......................................................................................................................................................48
VI. THUT TON TT HN.........................................................................................................................50
7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON.................................... 53
I. NH NGHA................................................................................................................................................53
II. NH L ......................................................................................................................................................53
III. CI T.....................................................................................................................................................53
8. BI TON NG I NGN NHT........................................................................................... 57
I. TH C TRNG S...............................................................................................................................57
II. BI TON NG I NGN NHT......................................................................................................57
III. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD BELLMAN...........58
IV. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON DIJKSTRA.............60
V. THUT TON DIJKSTRA V CU TRC HEAP.................................................................................63
VI. TRNG HP TH KHNG C CHU TRNH - TH T T P ................................................65
L Minh Hong

L thuyt th

\2[

VII. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD ...................................68


VIII. NHN XT..............................................................................................................................................70
9. BI TON CY KHUNG NH NHT .......................................................................................... 72
I. BI TON CY KHUNG NH NHT......................................................................................................72
II. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956) .......................................................................72
III. THUT TON PRIM (ROBERT PRIM - 1957).......................................................................................76
10. BI TON LUNG CC I TRN MNG.............................................................................. 80
I. BI TON.....................................................................................................................................................80
II. LT CT, NG TNG LUNG, NH L FORD - FULKERSON.................................................80
III. CI T.....................................................................................................................................................82
IV. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962)...............................85
11. BI TON TM B GHP CC I TRN TH HAI PHA................................................. 89
I. TH HAI PHA (BIPARTITE GRAPH).................................................................................................89
II. BI TON GHP I KHNG TRNG V CC KHI NIM...........................................................89
III. THUT TON NG M ....................................................................................................................90
IV. CI T.....................................................................................................................................................90
12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN TH HAI PHA THUT TON HUNGARI.................................................................................................................... 95
I. BI TON PHN CNG ............................................................................................................................95
II. PHN TCH .................................................................................................................................................95
III. THUT TON ...........................................................................................................................................96
IV. CI T...................................................................................................................................................100
V. BI TON TM B GHP CC I VI TRNG S CC I TRN TH HAI PHA..........105
VI. PHC TP TNH TON..................................................................................................................106
13. BI TON TM B GHP CC I TRN TH................................................................ 111
I. CC KHI NIM.......................................................................................................................................111
II. THUT TON EDMONDS (1965) ..........................................................................................................112
III. PHNG PHP LAWLER (1973)..........................................................................................................113
IV. CI T...................................................................................................................................................115
V. PHC TP TNH TON...................................................................................................................119

L Minh Hong

L thuyt th

\3[

0. M U
Trn thc t c nhiu bi ton lin quan ti mt tp cc i tng v nhng mi
lin h gia chng, i hi ton hc phi t ra mt m hnh biu din mt cch
cht ch v tng qut bng ngn ng k hiu, l th. Nhng tng c bn
ca n c a ra t th k th XVIII bi nh ton hc Thu S Leonhard Euler,
ng dng m hnh th gii bi ton v nhng cy cu Konigsberg ni
ting.
Mc d L thuyt th c khoa hc pht trin t rt lu nhng li c nhiu ng dng hin
i. c bit trong khong vi mi nm tr li y, cng vi s ra i ca my tnh in t v s
pht trin nhanh chng ca Tin hc, L thuyt th cng c quan tm n nhiu hn. c bit
l cc thut ton trn th c nhiu ng dng trong nhiu lnh vc khc nhau nh: Mng my
tnh, L thuyt m, Ti u ho, Kinh t hc v.v... Chng hn nh tr li cu hi: Hai my tnh trong
mng c th lin h c vi nhau hay khng ?; hay vn phn bit hai hp cht ho hc c cng
cng thc phn t nhng li khc nhau v cng thc cu to cng c gii quyt nh m hnh
th. Hin nay, mn hc ny l mt trong nhng kin thc c s ca b mn khoa hc my tnh.
Trong phm vi mt chuyn , khng th ni k v ni ht nhng vn ca l thuyt th. Tp
bi ging ny s xem xt l thuyt th di gc ngi lp trnh, tc l kho st nhng thut
ton c bn nht c th d dng ci t trn my tnh mt s ng dng ca n. Cc khi nim
tru tng v cc php chng minh s c din gii mt cch hnh thc cho n gin v d hiu
ch khng phi l nhng chng minh cht ch dnh cho ngi lm ton. Cng vic ca ngi lp
trnh l c hiu c tng c bn ca thut ton v ci t c chng trnh trong bi ton
tng qut cng nh trong trng hp c th. Thng thng sau qu trnh rn luyn, hu ht nhng
ngi lp trnh gn nh phi thuc lng cc m hnh ci t, khi p dng c th ci t ng
ngay v hiu qu, khng b mt thi gi vo cc cng vic g ri. Bi vic g ri mt thut ton tc
l phi d li tng bc tin hnh v t tr li cu hi: "Ti bc nu ng th phi nh th no
?", thc ra l tiu ph thi gian v ch chng minh li tnh ng n ca thut ton trong
trng hp c th, vi mt b d liu c th.
Trc khi tm hiu cc vn v l thuyt th, bn phi c k thut lp trnh kh tt, ngoi ra
nu c tm hiu trc v cc k thut vt cn, quay lui, mt s phng php ti u ho, cc bi
ton quy hoch ng th s gip ch nhiu cho vic c hiu cc bi ging ny.

L Minh Hong

L thuyt th

\4[

1. CC KHI NIM C BN
I. NH NGHA TH (GRAPH)
L mt cu trc ri rc gm cc nh v cc cnh ni cc nh . c m t hnh thc:
G = (V, E)
V gi l tp cc nh (Vertices) v E gi l tp cc cnh (Edges). C th coi E l tp cc cp (u, v)
vi u v v l hai nh ca V.
Mt s hnh nh ca th:

S giao thng

Mng my tnh
Hnh 1: V d v m hnh th

C th phn loi th theo c tnh v s lng ca tp cc cnh E:


Cho th G = (V, E). nh ngha mt cch hnh thc
1. G c gi l n th nu gia hai nh u, v ca V c nhiu nht l 1 cnh trong E ni t u
ti v.
2. G c gi l a th nu gia hai nh u, v ca V c th c nhiu hn 1 cnh trong E ni t u
ti v (Hin nhin n th cng l a th).
3. G c gi l th v hng nu cc cnh trong E l khng nh hng, tc l cnh ni hai
nh u, v bt k cng l cnh ni hai nh v, u. Hay ni cch khc, tp E gm cc cp (u, v)
khng tnh th t. (u, v)(v, u)
4. G c gi l th c hng nu cc cnh trong E l c nh hng, c th c cnh ni t
nh u ti nh v nhng cha chc c cnh ni t nh v ti nh u. Hay ni cch khc, tp E
gm cc cp (u, v) c tnh th t: (u, v) (v, u). Trong th c hng, cc cnh c gi l
cc cung. th v hng cng c th coi l th c hng nu nh ta coi cnh ni hai nh
u, v bt k tng ng vi hai cung (u, v) v (v, u).
V d:

V hng

C hng

V hng

n th
Hnh 2: Phn loi th

L Minh Hong

C hng
a th

L thuyt th

\5[

II. CC KHI NIM


Nh trn nh ngha th G = (V, E) l mt cu trc ri rc, tc l cc tp V v E hoc l tp
hu hn, hoc l tp m c, c ngha l ta c th nh s th t 1, 2, 3... cho cc phn t ca tp
V v E. Hn na, ng trn phng din ngi lp trnh cho my tnh th ta ch quan tm n cc
th hu hn (V v E l tp hu hn) m thi, chnh v vy t y v sau, nu khng ch thch g
thm th khi ni ti th, ta hiu rng l th hu hn.
Cnh lin thuc, nh k, bc

i vi th v hng G = (V, E). Xt mt cnh e E, nu e = (u, v) th ta ni hai nh u v v


l k nhau (adjacent) v cnh e ny lin thuc (incident) vi nh u v nh v.
Vi mt nh v trong th, ta nh ngha bc (degree) ca v, k hiu deg(v) l s cnh lin
thuc vi v. D thy rng trn n th th s cnh lin thuc vi v cng l s nh k vi v.
nh l: Gi s G = (V, E) l th v hng vi m cnh, khi tng tt c cc bc nh trong V
s bng 2m:

deg(v) = 2m

vV

Chng minh: Khi ly tng tt c cc bc nh tc l mi cnh e = (u, v) bt k s c tnh mt ln


trong deg(u) v mt ln trong deg(v). T suy ra kt qu.
H qu: Trong th v hng, s nh bc l l s chn

i vi th c hng G = (V, E). Xt mt cung e E, nu e = (u, v) th ta ni u ni ti v v


v ni t u, cung e l i ra khi nh u v i vo nh v. nh u khi c gi l nh u,
nh v c gi l nh cui ca cung e.
Vi mi nh v trong th c hng, ta nh ngha: Bn bc ra ca v k hiu deg+(v) l s
cung i ra khi n; bn bc vo k hiu deg-(v) l s cung i vo nh
nh l: Gi s G = (V, E) l th c hng vi m cung, khi tng tt c cc bn bc ra ca cc
nh bng tng tt c cc bn bc vo v bng m:

deg

vV

( v) = deg + ( v) = m
vV

Chng minh: Khi ly tng tt c cc bn bc ra hay bn bc vo, mi cung (u, v) bt k s c


tnh ng 1 ln trong deg+(u) v cng c tnh ng 1 ln trong deg-(v). T suy ra kt qu
Mt s tnh cht ca th c hng khng ph thuc vo hng ca cc cung. Do tin trnh
by, trong mt s trng hp ta c th khng quan tm n hng ca cc cung v coi cc cung
l cc cnh ca th v hng. V th v hng c gi l th v hng nn ca th
c hng ban u.

L Minh Hong

L thuyt th

\6[

2. BIU DIN TH TRN MY TNH


I. MA TRN LIN K (MA TRN K)
Gi s G = (V, E) l mt n th c s nh (k hiu V) l n, Khng mt tnh tng qut c
th coi cc nh c nh s 1, 2, ..., n. Khi ta c th biu din th bng mt ma trn vung
A = [aij] cp n. Trong :
aij = 1 nu (i, j) E
aij = 0 nu (i, j) E
Quy c aii = 0 vi i;
i vi a th th vic biu din cng tng t trn, ch c iu nu nh (i, j) l cnh th khng
phi ta ghi s 1 vo v tr aij m l ghi s cnh ni gia nh i v nh j
V d:
1
2
3
4
5
1
1
0
0
1
1
0
5
2
2
0
0
0
1
1
3
1
0
0
0
1
4
1
1
0
0
0
4
3
5
0
1
1
0
0

1
2
3
4
5

1
0
0
0
1
0

2
0
0
0
0
1

3
1
0
0
0
0

4
0
1
0
0
0

5
0
0
1
0
0

1
5

Cc tnh cht ca ma trn lin k:


1. i vi th v hng G, th ma trn lin k tng ng l ma trn i xng (aij = aji), iu ny
khng ng vi th c hng.
2. Nu G l th v hng v A l ma trn lin k tng ng th trn ma trn A:
Tng cc s trn hng i = Tng cc s trn ct i = Bc ca nh i = deg(i)
3. Nu G l th c hng v A l ma trn lin k tng ng th trn ma trn A:
Tng cc s trn hng i = Bn bc ra ca nh i = deg+(i)
Tng cc s trn ct i = Bn bc vo ca nh i = deg-(i)
Trong trng hp G l n th, ta c th biu din ma trn lin k A tng ng l cc phn t
logic. aij = TRUE nu (i, j) E v aij = FALSE nu (i, j) E
u im ca ma trn lin k:
n gin, trc quan, d ci t trn my tnh
kim tra xem hai nh (u, v) ca th c k nhau hay khng, ta ch vic kim tra bng mt
php so snh: auv 0.
Nhc im ca ma trn lin k:

L Minh Hong

L thuyt th

\7[

Bt k s cnh ca th l nhiu hay t, ma trn lin k lun lun i hi n2 nh lu cc


phn t ma trn, iu gy lng ph b nh dn ti vic khng th biu din c th vi s
nh ln.
Vi mt nh u bt k ca th, nhiu khi ta phi xt tt c cc nh v khc k vi n, hoc xt tt
c cc cnh lin thuc vi n. Trn ma trn lin k vic c thc hin bng cch xt tt c cc
nh v v kim tra iu kin auv 0. Nh vy, ngay c khi nh u l nh c lp (khng k vi nh
no) hoc nh treo (ch k vi 1 nh) ta cng buc phi xt tt c cc nh v kim tra iu kin
trn dn ti lng ph thi gian

II. DANH SCH CNH


Trong trng hp th c n nh, m cnh, ta c th biu din th di dng danh sch cnh,
trong cch biu din ny, ngi ta lit k tt c cc cnh ca th trong mt danh sch, mi phn
t ca danh sch l mt cp (u, v) tng ng vi mt cnh ca th. (Trong trng hp th c
hng th mi cp (u, v) tng ng vi mt cung, u l nh u v v l nh cui ca cung). Danh
sch c lu trong b nh di dng mng hoc danh sch mc ni. V d vi th di y:
1
5

Ci t trn mng:
1
(1, 3)

2
(2, 4)

3
(3, 5)

4
(4, 1)

5
(5, 2)

Ci t trn danh sch mc ni:


1

2
nil

u im ca danh sch cnh:


Trong trng hp th tha (c s cnh tng i nh: chng hn m < 6n), cch biu din
bng danh sch cnh s tit kim c khng gian lu tr, bi n ch cn 2m nh lu danh
sch cnh.
Trong mt s trng hp, ta phi xt tt c cc cnh ca th th ci t trn danh sch cnh
lm cho vic duyt cc cnh d dng hn. (Thut ton Kruskal chng hn)
Nhc im ca danh sch cnh:
Nhc im c bn ca danh sch cnh l khi ta cn duyt tt c cc nh k vi nh v no
ca th, th chng c cch no khc l phi duyt tt c cc cnh, lc ra nhng cnh c cha
nh v v xt nh cn li. iu kh tn thi gian trong trng hp th dy (nhiu cnh).
III. DANH SCH K
khc phc nhc im ca cc phng php ma trn k v danh sch cnh, ngi ta xut
phng php biu din th bng danh sch k. Trong cch biu din ny, vi mi nh v ca
th, ta cho tng ng vi n mt danh sch cc nh k vi v.
Vi th G = (V, E). V gm n nh v E gm m cnh. C hai cch ci t danh sch k ph bin:
L Minh Hong

L thuyt th

\8[
1

Cch 1: (Forward Star) Dng mt mng cc nh, mng chia lm n on, on th i trong mng
lu danh sch cc nh k vi nh i: V d vi th sau, danh sch k s l mt mng A gm 12
phn t:
1

10

11

12

3 5 1 3 1 2 4 3
5
1
4
on 1
on 2
on 3
on 4
on 5
bit mt on nm t ch s no n ch s no, ta c mt mng lu v tr ring. Ta gi mng lu
v tr l mng Head. Head[i] s bng ch s ng lin trc on th i. Quy c Head[n + 1] s
bng m. Vi th bn th mng VT[1..6] s l: (0, 3, 5, 8, 10, 12)
Nh vy on t v tr Head[i] + 1 n Head[i + 1] trong mng A s cha cc nh k vi nh i.
Lu rng vi th c hng gm m cung th cu trc Forward Star cn phi cha m phn t,
vi th v hng m cnh th cu trc Forward Star cn phi cha 2m phn t
Cch 2: Dng cc danh sch mc ni: Vi mi nh i ca th, ta cho tng ng vi n mt danh
sch mc ni cc nh k vi i, c ngha l tng ng vi mt nh i, ta phi lu li List[i] l cht
ca mt danh sch mc ni. V d vi th trn, danh sch mc ni s l:
List[1]

List[2]

List[3]

List[4]

Nil

List[5]

Nil

Nil

Nil

Nil

u im ca danh sch k:
i vi danh sch k, vic duyt tt c cc nh k vi mt nh v cho trc l ht sc d dng,
ci tn "danh sch k" cho thy r iu ny. Vic duyt tt c cc cnh cng n gin v mt
cnh thc ra l ni mt nh vi mt nh khc k n.
Nhc im ca danh sch k
V l thuyt, so vi hai phng php biu din trn, danh sch k tt hn hn. Ch c iu,
trong trng hp c th m ma trn k hay danh sch cnh khng th hin nhc im th ta
nn dng ma trn k (hay danh sch cnh) bi ci t danh sch k c phn di dng hn.
IV. NHN XT
Trn y l nu cc cch biu din th trong b nh ca my tnh, cn nhp d liu cho th th
c nhiu cch khc nhau, dng cch no th tu. Chng hn nu biu din bng ma trn k m cho
nhp d liu c ma trn cp n x n (n l s nh) th khi nhp t bn phm s rt mt thi gian, ta cho
nhp kiu danh sch cnh cho nhanh. Chng hn mng A (nxn) l ma trn k ca mt th v
hng th ta c th khi to ban u mng A gm ton s 0, sau cho ngi s dng nhp cc
cnh bng cch nhp cc cp (i, j); chng trnh s tng A[i, j] v A[j, i] ln 1. Vic nhp c th cho
kt thc khi ngi s dng nhp gi tr i = 0. V d:
program Nhap_Do_Thi;
L Minh Hong

L thuyt th

\9[

var
A: array[1..100, 1..100] of Integer; {Ma trn k ca th}
n, i, j: Integer;
begin
Write('Number of vertices'); ReadLn(n);
FillChar(A, SizeOf(A), 0);
repeat
Write('Enter edge (i, j) (i = 0 to exit) ');
ReadLn(i, j);
{Nhp mt cp (i, j) tng nh l nhp danh sch cnh}
if i <> 0 then
begin
{nhng lu tr trong b nh li theo kiu ma trn k}
Inc(A[i, j]);
Inc(A[j, i]);
end;
until i = 0;
{Nu ngi s dng nhp gi tr i = 0 th dng qu trnh nhp, nu khng th tip tc}
end.

Trong nhiu trng hp khng gian lu tr, vic chuyn i t cch biu din no sang cch
biu din khc khng c g kh khn. Nhng i vi thut ton ny th lm trn ma trn k ngn
gn hn, i vi thut ton kia c th lm trn danh sch cnh d dng hn v.v... Do , vi mc
ch d hiu, cc chng trnh sau ny s la chn phng php biu din sao cho vic ci t n
gin nht nhm nu bt c bn cht thut ton. Cn trong trng hp c th bt buc phi dng
mt cch biu din no khc, th vic sa i chng trnh cng khng tn qu nhiu thi gian.

L Minh Hong

L thuyt th

\ 10 [

3. CC THUT TON TM KIM TRN TH


I. BI TON
Cho th G = (V, E). u v v l hai nh ca G. Mt ng i (path) di l t nh u n nh v
l dy (u = x0, x1, ..., xl = v) tho mn (xi, xi+1) E vi i: (0 i < l).
ng i ni trn cn c th biu din bi dy cc cnh: (u = x0, x1), (x1, x2), ..., (xl-1, xl = v)
nh u c gi l nh u, nh v c gi l nh cui ca ng i. ng i c nh u trng
vi nh cui gi l chu trnh (Circuit), ng i khng c cnh no i qua hn 1 ln gi l ng
i n, tng t ta c khi nim chu trnh n.
V d: Xt mt th v hng v mt th c hng di y:
2

Trn c hai th, (1, 2, 3, 4) l ng i n di 3 t nh 1 ti nh 4. Bi (1, 2) (2, 3) v (3,


4) u l cc cnh (hay cung). (1, 6, 5, 4) khng phi ng i bi (6, 5) khng phi l cnh (hay
cung).
Mt bi ton quan trng trong l thuyt th l bi ton duyt tt c cc nh c th n c t
mt nh xut pht no . Vn ny a v mt bi ton lit k m yu cu ca n l khng c
b st hay lp li bt k nh no. Chnh v vy m ta phi xy dng nhng thut ton cho php
duyt mt cch h thng cc nh, nhng thut ton nh vy gi l nhng thut ton tm kim
trn th v y ta quan tm n hai thut ton c bn nht: thut ton tm kim theo chiu
su v thut ton tm kim theo chiu rng cng vi mt s ng dng ca chng.
Lu :
1. Nhng ci t di y l cho n th v hng, mun lm vi th c hng hay a th
cng khng phi sa i g nhiu.
2. D liu v th s c nhp t file vn bn GRAPH.INP. Trong :
Dng 1 cha s nh n ( 100), s cnh m ca th, nh xut pht S, nh kt thc F cch
nhau mt du cch.
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau mt du cch, th
hin c cnh ni nh u v nh v trong th.
3. Kt qu ghi ra file vn bn GRAPH.OUT
Dng 1: Ghi danh sch cc nh c th n c t S
Dng 2: ng i t S ti F c in ngc theo chiu t F v S

L Minh Hong

L thuyt th

\ 11 [

4
6

7
8
3

GRAPH.INP
8 7 1 5
1 2
1 3
2 3
2 4
3 5
4 6
7 8

GRAPH.OUT
1, 2, 3, 5, 4, 6,
5<-3<-2<-1

II. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)


1. Ci t quy
T tng ca thut ton c th trnh by nh sau: Trc ht, mi nh x k vi S tt nhin s n
c t S. Vi mi nh x k vi S th tt nhin nhng nh y k vi x cng n c t S...
iu gi cho ta vit mt th tc quy DFS(u) m t vic duyt t nh u bng cch thng
bo thm nh u v tip tc qu trnh duyt DFS(v) vi v l mt nh cha thm k vi u.

khng mt nh no b lit k ti hai ln, ta s dng k thut nh du, mi ln thm mt


nh, ta nh du nh li cc bc duyt quy k tip khng duyt li nh na

lu li ng i t nh xut pht S, trong th tc DFS(u), trc khi gi quy DFS(v)


vi v l mt nh k vi u m cha nh du, ta lu li vt ng i t u ti v bng cch t
TRACE[v] := u, tc l TRACE[v] lu li nh lin trc v trong ng i t S ti v. Khi qu
trnh tm kim theo chiu su kt thc, ng i t S ti F s l:
F p1 = Trace[F] p2 = Trace[p1] ... S.
procedure DFS(uV);
begin
< 1. Thng bo ti c u >;
< 2. nh du u l thm (c th ti c t S)>;
< 3. Xt mi nh v k vi u m cha thm, vi mi nh v >;
begin
Trace[v] := u;
{Lu vt ng i, nh m t ti v l u}
DFS(v);
{Gi quy duyt tng t i vi v}
end;
end;
begin {Chng trnh chnh}
< Nhp d liu: th, nh xut pht S, nh ch F >;
< Khi to: Tt c cc nh u cha b nh du >;
DFS(S);
< Nu F cha b nh du th khng th c ng i t S ti F >;
< Nu F b nh du th truy theo vt tm ng i t S ti F >;
end.
PROG03_1.PAS * Thut ton tm kim theo chiu su
program Depth_First_Search_1;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Free: array[1..max] of Boolean;
{Free[v] = True v cha c thm n}
Trace: array[1..max] of Integer;
{Trace[v] = nh lin trc v trn ng i t S ti v}
n, S, F: Integer;

L Minh Hong

L thuyt th

\ 12 [

procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
{Khi to th cha c cnh no}
ReadLn(n, m, S, F);
{c dng 1 ra 4 s n, m, S v F}
for i := 1 to m do
{c m dng tip ra danh sch cnh}
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure DFS(u: Integer);
var
v: Integer;
begin
Write(u, ', ');
Free[u] := False;
for v := 1 to n do
if Free[v] and a[u, v] then
begin
Trace[v] := u;
DFS(v);
end;
end;

{Thut ton tm kim theo chiu su bt u t nh u}

{Thng bo ti c u}
{nh du u thm}
{Vi mi nh v cha thm k vi u}
{Lu vt ng i: nh lin trc v trong ng i t S ti v l u}
{Tip tc tm kim theo chiu su bt u t v}

procedure Result;
{In ng i t S ti F}
begin
WriteLn;
{Vo dng th hai ca Output file}
if Free[F] then
{Nu F cha nh du thm tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt ng i, bt u t F}
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
{nh ngha li thit b nhp/xut chun thnh Input/Output file}

Assign(Input, 'GRAPH.INP'); Reset(Input);


Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
FillChar(Free, n, True);
DFS(S);
Result;
{ng Input/Output file, thc ra khng cn v BP t ng ng thit b nhp xut chun trc khi kt thc chng trnh}

Close(Input);
Close(Output);
end.

Ch :
a)
V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
b)
ng i t S ti F c th c nhiu, trn ch l mt trong s cc ng i. C th l ng
i c th t t in nh nht.

L Minh Hong

L thuyt th

c)

\ 13 [

C th chng cn dng mng nh du Free, ta khi to mng lu vt Trace ban u ton 0,


mi ln t nh u thm nh v, ta c thao tc gn vt Trace[v] := u, khi Trace[v] s khc 0.
Vy vic kim tra mt nh v l cha c thm ta c th kim tra Trace[v] = 0. Ch : ban
u khi to Trace[S] := -1 (Ch l cho khc 0 thi).

procedure DFS(u: Integer); {Ci tin}


var
v: Integer;
begin
Write(u, ', ');
for v := 1 to n do
if (Trace[v] = 0) and A[u, v] then {Trace[v] = 0 thay v Free[v] = True}
begin
Trace[v] := u; {Lu vt cng l nh du lun}
DFS(v);
end;
end;

V d: Vi th sau y, nh xut pht S = 1: qu trnh duyt quy c th v trn cy tm kim


DFS sau (Mi tn uv ch thao tc quy: DFS(u) gi DFS(v)).
2

4
6

2nd

5th

4
6

1st
1

8
3

6th

3rd

4th

Hnh 3: Cy DFS
Hi: nh 2 v 3 u k vi nh 1, nhng ti sao DFS(1) ch gi quy ti DFS(2) m khng gi DFS(3) ?.
Tr li: ng l c 2 v 3 u k vi 1, nhng DFS(1) s tm thy 2 trc v gi DFS(2). Trong DFS(2) s xt tt c cc nh k vi 2
m cha nh du th d nhin trc ht n tm thy 3 v gi DFS(3), khi 3 b nh du nn khi kt thc qu trnh quy gi
DFS(2), li v DFS(1) th nh 3 c thm ( b nh du) nn DFS(1) s khng gi DFS(3) na.
Hi: Nu F = 5 th ng i t 1 ti 5 trong chng trnh trn s in ra th no ?.
Tr li: DFS(5) do DFS(3) gi nn Trace[5] = 3. DFS(3) do DFS(2) gi nn Trace[3] = 2. DFS(2) do DFS(1) gi nn Trace[2] = 1. Vy
ng i l: 5 3 2 1.

Vi cy th hin qu trnh quy DFS trn, ta thy nu dy chuyn quy l: DFS(S) DFS
(u1) DFS(u2) ... Th th tc DFS no gi cui dy chuyn s c thot ra u tin, th tc
DFS(S) gi u dy chuyn s c thot cui cng. Vy nn chng, ta c th m t dy chuyn
quy bng mt ngn xp (Stack).
2. Ci t khng quy
Khi m t qu trnh quy bng mt ngn xp, ta lun lun cho ngn xp lu li dy chuyn
duyt su t nt gc (nh xut pht S).
<Thm S, nh du S thm>;
<y S vo ngn xp>;
{Dy chuyn quy ban u ch c mt nh S}
repeat
<Ly u khi ngn xp>;
{ang ng nh u}
if <u c nh k cha thm> then
begin
<Ch chn ly 1 nh v, l nh u tin k u m cha c thm>;
<Thng bo thm v>;
<y u tr li ngn xp>;
{Gi li a ch quay lui}
<y tip v vo ngn xp>;
{Dy chuyn duyt su c "ni" thm v na}
end;
{Cn nu u khng c nh k cha thm th ngn xp s ngn li, tng ng vi qu trnh li v ca dy chuyn DFS}

until <Ngn xp rng>;

L Minh Hong

L thuyt th

\ 14 [

PROG03_2.PAS * Thut ton tm kim theo chiu su khng quy


program Depth_First_Search_2;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer;
Stack: array[1..max] of Integer;
n, S, F, Last: Integer;
procedure Enter;
{Nhp d liu (t thit b nhp chun)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m, S, F);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init; {Khi to}
begin
FillChar(Free, n, True);
Last := 0;
end;

{Cc nh u cha nh du}


{Ngn xp rng}

procedure Push(V: Integer); {y mt nh V vo ngn xp}


begin
Inc(Last);
Stack[Last] := V;
end;
function Pop: Integer;
begin
Pop := Stack[Last];
Dec(Last);
end;

{Ly mt nh khi ngn xp, tr v trong kt qu hm}

procedure DFS;
var
u, v: Integer;
begin
Write(S, ', '); Free[S] := False;
Push(S);
repeat

{Thm S, nh du S thm}
{Khi ng dy chuyn duyt su}

{Dy chuyn duyt su ang l S ... u}

u := Pop;
{u l im cui ca dy chuyn duyt su hin ti}
for v := 1 to n do
if Free[v] and a[u, v] then
{Chn v l nh u tin cha thm k vi u, nu c:}
begin
Write(v, ', '); Free[v] := False; {Thm v, nh du v thm}
Trace[v] := u;
{Lu vt ng i}
Push(u); Push(v);
{Dy chuyn duyt su by gi l S ... u v}
Break;
end;
until Last = 0; {Ngn xp rng}
end;
L Minh Hong

L thuyt th

\ 15 [

procedure Result;
{In ng i t S ti F}
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
DFS;
Result;
Close(Input);
Close(Output);
end.

V d: Vi th di y (S = 1), Ta th theo di qu trnh thc hin th tc tm kim theo chiu


su dng ngn xp v i snh th t cc nh c thm vi th t t 1st n 6th trong cy tm
kim ca th tc DFS dng quy.
4

2
1

8
5

Trc ht ta thm nh 1 v y n vo ngn xp.


Bc lp
1
2
3
4
5
6
7
8
9
10
11

Ngn xp
(1)
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)

1
2
3
5
3
2
4
6
4
2
1

2
3
5
Khng c
Khng c
4
6
Khng c
Khng c
Khng c
Khng c

Ngn xp sau mi bc
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)

Gii thch
Tin su xung thm 2
Tin su xung thm 3
Tin su xung thm 5
Li li
Li li
Tin su xung thm 4
Tin su xung thm 6
Li li
Li li
Li li
Li ht dy chuyn, Xong

Trn y l phng php da vo tnh cht ca th tc quy tm ra phng php m phng n.


Tuy nhin, trn m hnh th th ta c th c mt cch vit khc tt hn cng khng quy: Th
nhn li cch thm nh ca DFS: T mt nh u, chn ly mt nh v k n m cha thm ri tin
su xung thm v. Cn nu mi nh k u u thm th li li mt bc v lp li qu trnh tng
L Minh Hong

L thuyt th

\ 16 [

t, vic li li ny c th thc hin d dng m khng cn dng Stack no c, bi vi mi nh u


c mt nhn Trace[u] (l nh m t m ta ti thm u), khi quay lui t u s li v .
Vy nu ta ang ng nh u, th nh k tip phi thm ti s c tm nh trong hm FindNext
di y:
function FindNext(uV): V;
{Tm nh s thm sau nh u, tr v 0 nu mi nh ti c t S u thm}
begin
repeat
for (v K(u)) do
if <v cha thm> then
{Nu u c nh k cha thm th chn nh k u tin cha thm thm tip}
begin
Trace[v] := u; {Lu vt}
FindNext := v;
Exit;
end;
u := Trace[u]; {Nu khng, li v mt bc. Lu l Trace[S] c gn bng n + 1}
until u = n + 1;
FindNext := 0; { trn khng Exit c tc l mi nh ti c t S duyt xong}
end;
begin
{Thut ton duyt theo chiu su}
Trace[S] := n + 1;
u := S;
repeat
<Thng bo thm u, nh du u thm>;
u := FindNext(u);
until u = 0;
end;

III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)
1. Ci t bng hng i
C s ca phng php ci t ny l "lp lch" duyt cc nh. Vic thm mt nh s ln lch
duyt cc nh k n sao cho th t duyt l u tin chiu rng (nh no gn S hn s c duyt
trc). V d: Bt u ta thm nh S. Vic thm nh S s pht sinh th t duyt nhng nh (x1,
x2, ..., xp) k vi S (nhng nh gn S nht). Khi thm nh x1 s li pht sinh yu cu duyt nhng
nh (u1, u2 ..., uq) k vi x1. Nhng r rng cc nh u ny "xa" S hn nhng nh x nn chng ch
c duyt khi tt c nhng nh x duyt xong. Tc l th t duyt nh sau khi thm x1 s l:
(x2, x3..., xp, u1, u2, ..., uq).
S

x1

u1

u2

x2

...

...

uq

xp

Phi duyt sau xp

Hnh 4: Cy BFS

Gi s ta c mt danh sch cha nhng nh ang "ch" thm. Ti mi bc, ta thm mt nh u


danh sch v cho nhng nh cha "xp hng" k vi n xp hng thm vo cui danh sch. Chnh
v nguyn tc nn danh sch cha nhng nh ang ch s c t chc di dng hng i
(Queue)
Ta s dng gii thut nh sau:
Bc 1: Khi to:
L Minh Hong

L thuyt th

\ 17 [

Cc nh u trng thi cha nh du, ngoi tr nh xut pht S l nh du


Mt hng i (Queue), ban u ch c mt phn t l S. Hng i dng cha cc nh s
c duyt theo th t u tin chiu rng
Bc 2: Lp cc bc sau n khi hng i rng:
Ly u khi hng i, thng bo thm u (Bt u vic duyt nh u)
Xt tt c nhng nh v k vi u m cha c nh du, vi mi nh v :
1. nh du v.
2. Ghi nhn vt ng i t u ti v (C th lm chung vi vic nh du)
3. y v vo hng i (v s ch c duyt ti nhng bc sau)
Bc 3: Truy vt tm ng i.
PROG03_3.PAS * Thut ton tm kim theo chiu rng dng hng i
program Breadth_First_Search_1;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
{Free[v] v cha c xp vo hng i ch thm}
Trace: array[1..max] of Integer;
Queue: array[1..max] of Integer;
n, S, F, First, Last: Integer;
procedure Enter;
{Nhp d liu}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m, S, F);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
{Khi to}
begin
FillChar(Free, n, True);
Free[S] := False;
Queue[1] := S;
Last := 1;
First := 1;
end;

{Cc nh u cha nh du}


{Ngoi tr nh S}
{Hng i ch gm c mt nh S}

procedure Push(V: Integer); {y mt nh V vo hng i}


begin
Inc(Last);
Queue[Last] := V;
end;
function Pop: Integer;
begin
Pop := Queue[First];
Inc(First);
end;
procedure BFS;
var
L Minh Hong

{Ly mt nh khi hng i, tr v trong kt qu hm}

{Thut ton tm kim theo chiu rng}

L thuyt th

\ 18 [

u, v: Integer;
begin
repeat
u := Pop;
{Ly mt nh u khi hng i}
Write(u, ', ');
{Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then
{Xt nhng nh v cha nh du k u}
begin
Push(v);
{a v vo hng i ch thm}
Free[v] := False;
{nh du v}
Trace[v] := u;
{Lu vt ng i: nh lin trc v trong ng i t S l u}
end;
until First > Last;
{Cho ti khi hng i rng}
end;
procedure Result;
{In ng i t S ti F}
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.

V d: Xt th di y, nh xut pht S = 1.
4

2
1

Hng i

nh u
(ly ra t hng i)

(1)

(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6)

2
3
4
5
6

L Minh Hong

Hng i
(sau khi ly u ra)

(3)
(4)
(5)
(6)

8
5

Cc nh v k u m
cha ln lch

Hng i sau khi y


nhng nh v vo

2, 3

(2, 3)

4
5
6
Khng c
Khng c

(3, 4)
(4, 5)
(5, 6)
(6)

L thuyt th

\ 19 [

th t cc phn t ly ra khi hng i, ta thy trc ht l 1; sau n 2, 3; ri mi ti 4, 5;


cui cng l 6. R rng l nh gn S hn s c duyt trc. V nh vy, ta c nhn xt: nu kt
hp lu vt tm ng i th ng i t S ti F s l ng i ngn nht (theo ngha qua t cnh
nht)
2. Ci t bng thut ton loang
Cch ci t ny s dng hai tp hp, mt tp "c" cha nhng nh "ang xt", mt tp "mi"
cha nhng nh "s xt". Ban u tp "c" ch gm mi nh xut pht, ti mi bc ta s dng tp
"c" tnh tp "mi", tp "mi" s gm nhng nh cha c thm m k vi mt nh no ca
tp "c". Lp li cng vic trn (sau khi gn tp "c" bng tp "mi") cho ti khi tp c l rng:
4

1
3

Hnh 5: Thut ton loang

Gii thut loang c th dng nh sau:


Bc 1: Khi to
Cc nh khc S u cha b nh du, nh S b nh du, tp "c" Old := {S}
Bc 2: Lp cc bc sau n khi Old =
t tp "mi" New = , sau dng tp "c" tnh tp "mi" nh sau:
Xt cc nh u Old, vi mi nh u :
Thng bo thm u
Xt tt c nhng nh v k vi u m cha b nh du, vi mi nh v :
nh du v
Lu vt ng i, nh lin trc v trong ng i Sv l u
a v vo tp New
Gn tp "c" Old := tp "mi" New v lp li (c th lun phin vai tr hai tp ny)
Bc 3: Truy vt tm ng i.
PROG03_4.PAS * Thut ton tm kim theo chiu rng dng phng php loang
program Breadth_First_Search_2;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer;
Old, New: set of Byte;
n, S, F: Byte;
procedure Enter;
{Nhp d liu}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m, S, F);

L Minh Hong

L thuyt th

\ 20 [

for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
begin
FillChar(Free, n, True);
Free[S] := False; {Cc nh u cha nh du, ngoi tr nh S nh du}
Old := [S];
{Tp "c" khi to ban u ch c mi S}
end;
procedure BFS; {Thut ton loang}
var
u, v: Byte;
begin
repeat {Lp: dng Old tnh New}
New := [];
for u := 1 to n do
if u in Old then {Xt nhng nh u trong tp Old, vi mi nh u :}
begin
Write(u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Qut tt c nhng nh v cha b nh du m k vi u}
begin
Free[v] := False; {nh du v v lu vt ng i}
Trace[v] := u;
New := New + [v]; {a v vo tp New}
end;
end;
Old := New;
{Gn tp "c" := tp "mi" v lp li}
until Old = []; {Cho ti khi khng loang c na}
end;
procedure Result;
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.

L Minh Hong

L thuyt th

\ 21 [

IV. PHC TP TNH TON CA BFS V DFS


Qu trnh tm kim trn th bt u t mt nh c th thm tt c cc nh cn li, khi cch
biu din th c nh hng ln ti chi ph v thi gian thc hin gii thut:
Trong trng hp ta biu din th bng danh sch k, c hai thut ton BFS v DFS u c
phc tp tnh ton l O(n + m) = O(max(n, m)). y l cch ci t tt nht.
Nu ta biu din th bng ma trn k nh trn th phc tp tnh ton trong trng hp
ny l O(n + n2) = O(n2).
Nu ta biu din th bng danh sch cnh, thao tc duyt nhng nh k vi nh u s dn ti
vic phi duyt qua ton b danh sch cnh, y l ci t ti nht, n c phc tp tnh ton
l O(n.m).

L Minh Hong

L thuyt th

\ 22 [

4. TNH LIN THNG CA TH


I. NH NGHA
1. i vi th v hng G = (V, E)
G gi l lin thng (connected) nu lun tn ti ng i gia mi cp nh phn bit ca th.
Nu G khng lin thng th chc chn n s l hp ca hai hay nhiu th con* lin thng, cc
th con ny i mt khng c nh chung. Cc th con lin thng ri nhau nh vy c gi l
cc thnh phn lin thng ca th ang xt (Xem v d).
G2

G1
G3

Hnh 6: th G v cc thnh phn lin thng G1, G2, G3 ca n

i khi, vic xo i mt nh v tt c cc cnh lin thuc vi n s to ra mt th con mi c


nhiu thnh phn lin thng hn th ban u, cc nh nh th gi l nh ct hay im khp.
Hon ton tng t, nhng cnh m khi ta b n i s to ra mt th c nhiu thnh phn lin
thng hn so vi th ban u c gi l mt cnh ct hay mt cu.

Hnh 7: Khp v cu

2. i vi th c hng G = (V, E)
C hai khi nim v tnh lin thng ca th c hng tu theo chng ta c quan tm ti hng
ca cc cung khng.
G gi l lin thng mnh (Strongly connected) nu lun tn ti ng i (theo cc cung nh
hng) gia hai nh bt k ca th, g gi l lin thng yu (weakly connected) nu th v
hng nn ca n l lin thng

Hnh 8: Lin thng mnh v Lin thng yu

th G = (V, E) l con ca th G' = (V', E') nu G l th c VV' v E E'

L Minh Hong

L thuyt th

\ 23 [

II. TNH LIN THNG TRONG TH V HNG


Mt bi ton quan trng trong l thuyt th l bi ton kim tra tnh lin thng ca th v
hng hay tng qut hn: Bi ton lit k cc thnh phn lin thng ca th v hng.
Gi s th v hng G = (V, E) c n nh nh s 1, 2, ..., n.
lit k cc thnh phn lin thng ca G phng php c bn nht l:
nh du nh 1 v nhng nh c th n t 1, thng bo nhng nh thuc thnh phn lin
thng th nht.
Nu tt c cc nh u b nh du th G l th lin thng, nu khng th s tn ti mt
nh v no cha b nh du, ta s nh du v v cc nh c th n c t v, thng bo
nhng nh thuc thnh phn lin thng th hai.
V c tip tc nh vy cho ti khi tt c cc nh u b nh du
procedure Duyt(u)
begin
<Dng BFS hoc DFS lit k v nh du nhng nh c th n c t u>
end;
begin
for v V do <khi to v cha nh du>;
Count := 0;
for u := 1 to n do
if <u cha nh du> then
begin
Count := Count + 1;
WriteLn('Thnh phn lin thng th ', Count, ' gm cc nh : ');
Duyt(u);
end;
end.

Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n ng
bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Duyt.
III. TH Y V THUT TON WARSHALL
1. nh ngha:
th y vi n nh, k hiu Kn, l mt n th v hng m gia hai nh bt k ca n
u c cnh ni.
n.(n 1)
2
th y Kn c ng: C n =
cnh v bc ca mi nh u bng n - 1.
2

K3

K4

K5

Hnh 9: th y

2. Bao ng th:
Vi th G = (V, E), ngi ta xy dng th G' = (V, E') cng gm nhng nh ca G cn cc
cnh xy dng nh sau: ( y quy c gia u v u lun c ng i)
Gia nh u v v ca G' c cnh ni Gia nh u v v ca G c ng i
th G' xy dng nh vy c gi l bao ng ca th G.

L Minh Hong

L thuyt th

\ 24 [

T nh ngha ca th y , ta d dng suy ra mt th y bao gi cng lin thng v t


nh ngha th lin thng, ta cng d dng suy ra c:

Mt n th v hngl lin thng nu v ch nu bao ng ca n l th y

Mt n th v hng c k thnh phn lin thng nu v ch nu bao ng ca n c k


thnh phn lin thng y .

Hnh 10: n th v hng v bao ng ca n

Bi vic kim tra mt th c phi th y hay khng c th thc hin kh d dng (m s


cnh chng hn) nn ngi ta ny ra tng c th kim tra tnh lin thng ca th thng qua
vic kim tra tnh y ca bao ng. Vn t ra l phi c thut ton xy dng bao ng ca
mt th cho trc v mt trong nhng thut ton l:
3. Thut ton Warshall
Thut ton Warshall - gi theo tn ca Stephen Warshall, ngi m t thut ton ny vo nm
1960, i khi cn c gi l thut ton Roy-Warshall v Roy cng m t thut ton ny vo
nm 1959. Thut ton c th m t rt gn:
T ma trn k A ca n th v hng G (aij = True nu (i, j) l cnh ca G) ta s sa i A
n tr thnh ma trn k ca bao ng bng cch: Vi mi nh k xt theo th t t 1 ti n, ta xt
tt c cc cp nh (u, v): nu c cnh ni (u, k) (auk = True) v c cnh ni (k, v) (akv = True)
th ta t ni thm cnh (u, v) nu n cha c (t auv := True). T tng ny da trn mt quan
st n gin nh sau: Nu t u c ng i ti k v t k li c ng i ti v th tt nhin t u s c
ng i ti v.
Vi n l s nh ca th, ta c th vit thut ton Warshall nh sau:
for k := 1 to n do
for u := 1 to n do
if a[u, k] then
for v := 1 to n do
if a[k, v] then a[u, v] := True;

hoc
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];

Vic chng minh tnh ng n ca thut ton i hi phi lt li cc l thuyt v bao ng bc cu


v quan h lin thng, ta s khng trnh by y. C nhn xt rng tuy thut ton Warshall rt d
ci t nhng phc tp tnh ton ca thut ton ny kh ln (O(n3)).
Di y, ta s th ci t thut ton Warshall tm bao ng ca n th v hng sau m s
thnh phn lin thng ca th:
Vic ci t thut ton s qua nhng bc sau:
1. Nhp ma trn k A ca th (Lu y A[v, v] lun c coi l True vi v)
2. Dng thut ton Warshall tm bao ng, khi A l ma trn k ca bao ng th
L Minh Hong

L thuyt th

\ 25 [

3. Da vo ma trn k A, nh 1 v nhng nh k vi n s thuc thnh phn lin thng th nht;


vi nh u no khng k vi nh 1, th u cng vi nhng nh k n s thuc thnh phn lin
thng th hai; vi nh v no khng k vi c nh 1 v nh u, th v cng vi nhng nh k
n s thuc thnh phn lin thng th ba v.v...
u

Input: file vn bn GRAPH.INP


Dng 1: Cha s nh n ( 100) v s cnh m ca th cch nhau t nht mt du cch
m dng tip theo, mi dng cha mt cp s u v v cch nhau t nht mt du cch tng trng
cho mt cnh (u, v)
Output: file vn bn GRAPH.OUT
Lit k cc thnh phn lin thng

1
3
2
5
4

12

10

11

GRAPH.INP
12 9
1 3
1 4
1 5
2 4
6 7
6 8
9 10
9 11
11 12

GRAPH.OUT
Connected Component 1:
1, 2, 3, 4, 5,
Connected Component 2:
6, 7, 8,
Connected Component 3:
9, 10, 11, 12,

PROG04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng


program Connectivity;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Free: array[1..max] of Boolean;
{Free[v] = True v cha c lit k vo thnh phn lin thng no}
k, u, v, n: Integer;
Count: Integer;
procedure Enter;
{Nhp th}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for v := 1 to n do a[v, v] := True; {D nhin t v c ng i n chnh v}
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;

L Minh Hong

L thuyt th

\ 26 [

end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
{Thut ton Warshall}

for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
Count := 0;
FillChar(Free, n, True); {Mi nh u cha c lit k vo thnh phn lin thng no}
for u := 1 to n do
if Free[u] then
{Vi mt nh u cha c lit k vo thnh phn lin thng no}
begin
Inc(Count);
WriteLn('Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then
{Xt nhng nh k u (trn bao ng)}
begin
Write(v, ', ');
{Lit k nh vo thnh phn lin thng cha u}
Free[v] := False; {Lit k nh no nh du nh }
end;
WriteLn;
end;
Close(Input);
Close(Output);
end.

IV. CC THNH PHN LIN THNG MNH


i vi th c hng, ngi ta quan tm n bi ton kim tra tnh lin thng mnh, hay tng
qut hn: Bi ton lit k cc thnh phn lin thng mnh ca th c hng. i vi bi ton
ta c mt phng php kh hu hiu da trn thut ton tm kim theo chiu su Depth First
Search.
1. Phn tch
Thm vo th mt nh x v ni x vi tt c cc nh cn li ca th bng cc cung nh
hng. Khi qu trnh tm kim theo chiu su bt u t x c th coi nh mt qu trnh xy dng
cy tm kim theo chiu su (cy DFS) gc x.
procedure Visit(uV);
begin
<Thm u vo cy tm kim DFS>;
for (v: (u, v)E) do
if <v khng thuc cy DFS> then Visit(v);
end;
begin
<Thm vo th nh x v cc cung nh hng (x, v) vi mi v>;
<Khi to cy tm kim DFS := >;
Visit(x);
end.

th tc thm nh quy Visit(u). Th tc ny xt tt c nhng nh v ni t u, nu v cha


c thm th i theo cung thm v, tc l b sung cung (u, v) vo cy tm kim DFS. Nu v
thm th c ba kh nng xy ra i vi v tr ca u v v trong cy tm kim DFS:

L Minh Hong

L thuyt th

\ 27 [

1.

v l tin bi (ancestor - t tin) ca u, tc l v c thm trc u v th tc Visit(u) do dy


chuyn quy t th tc Visit(v) gi ti. Cung (u, v) khi c gi l cung ngc (Back
edge)
2.
v l hu du (descendant - con chu) ca u, tc l u c thm trc v, nhng th tc Visit(u)
sau khi tin quy theo mt hng khc gi Visit(v) ri. Nn khi dy chuyn quy li li
v th tc Visit(u) s thy v l thm nn khng thm li na. Cung (u, v) khi gi l
cung xui (Forward edge).
3.
v thuc mt nhnh ca cy DFS duyt trc , tc l s c mt nh w c thm trc
c u v v. Th tc Visit(w) gi trc s r theo mt nhnh no thm v trc, ri khi li li,
r sang mt nhnh khc thm u. Cung (u, v) khi gi l cung cho (Cross edge)
(Rt tic l t in thut ng tin hc Anh-Vit qu ngho nn nn khng th tm ra nhng t tng
ng vi cc thut ng trn. Ta c th hiu qua cc v d)
1st

1st
5th

5th
2nd

1st

2nd

5th
2nd

6th

3rd
u
4th

TH1: v l tin bi ca u
(u, v) l cung ngc

6th

3rd

6th

3rd

7th

7th

v
4th

TH2: v l hu du ca u
(u, v) l cung xui

7th

4th

TH3: v nm nhnh DFS duyt


trc u
(u, v l cung cho)

Hnh 11: Ba dng cung ngoi cy DFS

Ta nhn thy mt c im ca thut ton tm kim theo chiu su, thut ton khng ch duyt qua
cc nh, n cn duyt qua tt c nhng cung na. Ngoi nhng cung nm trn cy tm kim, nhng
cung cn li c th chia lm ba loi: cung ngc, cung xui, cung cho.
2. Cy tm kim DFS v cc thnh phn lin thng mnh
nh l 1:
Nu a, b l hai nh thuc thnh phn lin thng mnh C th vi mi ng i t a ti b cng
nh t b ti a. Tt c nh trung gian trn ng i u phi thuc C.
Chng minh
Nu a v b l hai nh thuc C th tc l c mt ng i t a ti b v mt ng i khc t b ti a.
Suy ra vi mt nh v nm trn ng i t a ti b th a ti c v, v ti c b, m b c ng ti
a nn v cng ti c a. Vy v nm trong thnh phn lin thng mnh cha a tc l vC. Tng
t vi mt nh nm trn ng i t b ti a.
nh l 2:
Vi mt thnh phn lin thng mnh C bt k, s tn ti mt nh r C sao cho mi nh ca
C u thuc nhnh DFS gc r.
Chng minh:

L Minh Hong

L thuyt th

\ 28 [

Trc ht, nhc li mt thnh phn lin thng mnh l mt th con lin thng mnh ca th
ban u tho mn tnh cht ti i tc l vic thm vo thnh phn mt tp hp nh khc s lm
mt i tnh lin thng mnh.
Trong s cc nh ca C, chn r l nh c thm u tin theo thut ton tm kim theo chiu
su. Ta s chng minh C nm trong nhnh DFS gc r. Tht vy: vi mt nh v bt k ca C, do C
lin thng mnh nn phi tn ti mt ng i t r ti v:
(r = x0, x1, ..., xk = v)
T nh l 1, tt c cc nh x1, x2, ..., xk u thuc C nn chng s phi thm sau nh r. Khi th
tc Visit(r) c gi th tt c cc nh x1, x2..., xk=v u cha thm; v th tc Visit(r) s lit k tt
c nhng nh cha thm n c t r bng cch xy dng nhnh gc r ca cy DFS, nn cc nh
x1, x2, ..., xk = v s thuc nhnh gc r ca cy DFS. Bi chn v l nh bt k trong C nn ta c iu
phi chng minh.
nh r trong chng minh nh l - nh thm trc tt c cc nh khc trong C - gi l cht ca
thnh phn C. Mi thnh phn lin thng mnh c duy nht mt cht. Xt v v tr trong cy tm
kim DFS, cht ca mt thnh phn lin thng l nh nm cao nht so vi cc nh khc thuc
thnh phn , hay ni cch khc: l tin bi ca tt c cc nh thuc thnh phn .
nh l 3:
Lun tm c nh cht a tho mn: Qu trnh tm kim theo chiu su bt u t a khng
thm c bt k mt cht no khc. (Tc l nhnh DFS gc a khng cha mt cht no ngoi a)
chng hn ta chn a l cht c thm sau cng trong mt dy chuyn quy hoc chn a l cht
thm sau tt c cc cht khc. Vi cht a nh vy th cc nh thuc nhnh DFS gc a chnh l
thnh phn lin thng mnh cha a.
Chng minh:
Vi mi nh v nm trong nhnh DFS gc a, xt b l cht ca thnh phn lin thng mnh cha v.
Ta s chng minh a b. Tht vy, theo nh l 2, v phi nm trong nhnh DFS gc b. Vy v nm
trong c nhnh DFS gc a v nhnh DFS gc b. Gi s phn chng rng ab th s c hai kh nng
xy ra:
b

...

...

...
a

b
...
...

...

...

v
...

...
...

...

v
...

Kh nng 1: a b v
Kh nng 1: b a v

Kh nng 1: Nhnh DFS gc a cha nhnh DFS gc b, c ngha l th tc Visit(b) s do th


tc Visit(a) gi ti, iu ny mu thun vi gi thit rng a l cht m qu trnh tm kim theo
chiu su bt u t a khng thm mt cht no khc.

Kh nng 2: Nhnh DFS gc a nm trong nhnh DFS gc b, c ngha l a nm trn mt


ng i t b ti v. Do b v v thuc cng mt thnh phn lin thng mnh nn theo nh l 1,
a cng phi thuc thnh phn lin thng mnh . Vy th thnh phn lin thng mnh ny c
hai cht a v b. iu ny v l.

L Minh Hong

L thuyt th

\ 29 [

Theo nh l 2, ta c thnh phn lin thng mnh cha a nm trong nhnh DFS gc a, theo
chng minh trn ta li c: Mi nh trong nhnh DFS gc a nm trong thnh phn lin thng
mnh cha a. Kt hp li c: Nhnh DFS gc a chnh l thnh phn lin thng mnh cha a.
3. Thut ton Tarjan (R.E.Tarjan - 1972)
Chn u l cht m t qu trnh tm kim theo chiu su khng thm thm bt k mt cht no
khc, chn ly thnh phn lin thng mnh th nht l nhnh DFS gc u. Sau loi b nhnh DFS
gc u ra khi cy DFS, li tm thy mt nh cht v khc m nhnh DFS gc v khng cha cht no
khc, li chn ly thnh phn lin thng mnh th hai l nhnh DFS gc v. Tng t nh vy cho
thnh phn lin thng mnh th ba, th t, v.v... C th hnh dung thut ton Tarjan "b" cy DFS
ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt thnh phn lin thng mnh.
1

8
3

4
9

10

10

6
11
7

11
7

Hnh 12: Thut ton Tarjan "b" cy DFS

Trnh by di dng nh vy, nhng iu quan trng nht by gi mi ni ti: Lm th no kim


tra mt nh v no c phi l cht hay khng ?
Hy nhnh DFS gc nh r no .
Nhn xt 1:
Nu nh t cc nh thuc nhnh gc r ny khng c cung ngc hay cung cho no i ra khi
nhnh th r l cht. iu ny d hiu bi nh vy c ngha l t r, i theo cc cung ca th
th ch n c nhng nh thuc nhnh m thi. Vy:
Thnh phn lin thng mnh cha r Tp cc nh c th n t r = Nhnh DFS gc r
nn r l cht.
Nhn xt 2:
Nu t mt nh v no ca nhnh DFS gc r c mt cung ngc ti mt nh w l tin bi
ca r, th r khng l cht. Tht vy: do c chu trnh (wrvw) nn w, r, v thuc cng mt
thnh phn lin thng mnh. M w c thm trc r, iu ny mu thun vi cch xc nh cht
(Xem li nh l 2)
Nhn xt 3:
Vn phc tp gp phi y l nu t mt nh v ca nhnh DFS gc r, c mt cung cho i ti
mt nhnh khc. Ta s thit lp gii thut lit k thnh phn lin thng mnh ngay trong th tc
Visit(u), khi m nh u duyt xong, tc l khi cc nh khc ca nhnh DFS gc u u
thm v qu trnh thm quy li li v Visit(u). Nu nh u l cht, ta thng bo nhnh DFS gc u
l thnh phn lin thng mnh cha u v loi ngay cc nh thuc thnh phn khi th cng
nh khi cy DFS. C th chng minh c tnh ng n ca phng php ny, bi nu nhnh
DFS gc u cha mt cht u' khc th u' phi duyt xong trc u v c nhnh DFS gc u' b loi
L Minh Hong

L thuyt th

\ 30 [

b ri. Hn na cn c th chng minh c rng, khi thut ton tin hnh nh trn th nu nh t
mt nh v ca mt nhnh DFS gc r c mt cung cho i ti mt nhnh khc th r khng l
cht.
chng t iu ny, ta da vo tnh cht ca cy DFS: cung cho s ni t mt nhnh ti nhnh
thm trc , ch khng bao gi c cung cho i ti nhnh thm sau. Gi s c cung cho (v, v')
i t v nhnh DFS gc r ti v' nhnh DFS gc r, gi r' l cht ca thnh phn lin thng cha
v'. Theo tnh cht trn, v' phi thm trc r, suy ra r' cng phi thm trc r. C hai kh nng xy
ra:

Nu r' thuc nhnh DFS duyt trc r th r' s c duyt xong trc khi thm r, tc l khi
thm r v c sau ny khi thm v th nhnh DFS gc r' b hu, cung cho (v, v') s khng
c tnh n na.

Nu r' l tin bi ca r th ta c r' n c r, v nm trong nhnh DFS gc r nn r n c


v, v n c v' v (v, v') l cung, v' li n c r' bi r' l cht ca thnh phn lin thng
mnh cha v'. Ta thit lp c chu trnh (r'rvv'r'), suy ra r' v r thuc cng mt
thnh phn lin thng mnh, r' l cht nn r khng th l cht na.
T ba nhn xt v cch ci t chng trnh nh trong nhn xt 3, Ta c: nh r l cht nu v ch
nu khng tn ti cung ngc hoc cung cho ni mt nh thuc nhnh DFS gc r vi mt nh
ngoi nhnh , hay ni cch khc: r l cht nu v ch nu khng tn ti cung ni t mt nh
thuc nhnh DFS gc r ti mt nh thm trc r.
Di y l mt ci t ht sc thng minh, ch cn sa i mt cht th tc Visit trn l ta c
ngay phng php ny. Ni dung ca n l nh s th t cc nh t nh c thm u tin n
nh thm sau cng. nh ngha Numbering[u] l s th t ca nh u theo cch nh s . Ta tnh
thm Low[u] l gi tr Numbering nh nht trong cc nh c th n c t mt nh v no
ca nhnh DFS gc u bng mt cung (vi gi thit rng u c mt cung gi ni vi chnh u).
C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u v khi gn
Low[u] := Numbering[u] (u c cung ti chnh u)
Xt tt c nhng nh v ni t u:

Nu v thm th ta cc tiu ho Low[u] theo cng thc:


Low[u]mi := min(Low[u]c, Numbering[v]).

Nu v cha thm th ta gi quy i thm v, sau cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Low[v])
D dng chng minh c tnh ng n ca cng thc tnh.
Khi duyt xong mt nh u (chun b thot khi th tc Visit(u). Ta so snh Low[u] v
Numbering[u]. Nu nh Low[u] = Numbering[u] th u l cht, bi khng c cung ni t mt nh
thuc nhnh DFS gc u ti mt nh thm trc u. Khi ch vic lit k cc nh thuc thnh phn
lin thng mnh cha u l nhnh DFS gc u.
cng vic d dng hn na, ta nh ngha mt danh sch L c t chc di dng ngn xp v
dng ngn xp ny ly ra cc nh thuc mt nhnh no . Khi thm ti mt nh u, ta y ngay
nh u vo ngn xp, th khi duyt xong nh u, mi nh thuc nhnh DFS gc u s c y
vo ngn xp L ngay sau u. Nu u l cht, ta ch vic ly cc nh ra khi ngn xp L cho ti khi ly
ti nh u l s c nhnh DFS gc u cng chnh l thnh phn lin thng mnh cha u.
procedure Visit(uV);
begin
L Minh Hong

L thuyt th

\ 31 [

Count := Count + 1; Numbering[u] := Count; {Trc ht nh s u}


Low[u] := Numbering[u];
<a u vo cy DFS>;
<y u vo ngn xp L>;
for (v: (u, v)E) do
if <v thm> then
Low[u] := min(Low[u], Numbering[v])
else
begin
Visit(v);
Low[u] := min(Low[u], Low[v]);
end;
if Numbering[u] = Low[u] then {Nu u l cht}
begin
<Thng bo thnh phn lin thng mnh vi cht u gm c cc nh:>;
repeat
<Ly t ngn xp L ra mt nh v>;
<Output v>;
<Xo nh v khi th>;
until v = u;
end;
end;
begin
<Thm vo
<Khi to
<Khi to
<Khi to
Visit(x)
end.

th mt nh x v cc cung (x, v) vi mi v>;


mt bin m Count := 0>;
mt ngn xp L := >;
cy tm kim DFS := >;

Bi thut ton Tarjan ch l sa i mt cht thut ton DFS, cc thao tc vo/ra ngn xp c
thc hin khng qu n ln. Vy nn nu th c n nh v m cung th phc tp tnh ton ca
thut ton Tarjan vn l O(n + m) trong trng hp biu din th bng danh sch k, l O(n2)
trong trng hp biu din bng ma trn k v l O(n.m) trong trng hp biu din bng danh
sch cnh.
Mi th sn sng, di y l ton b chng trnh. Trong chng trnh ny, ta s dng:

Ma trn k A biu din th.

Mng Free kiu Boolean, Free[u] = True nu u cha b lit k vo thnh phn lin thng no,
tc l u cha b loi khi th.

Mng Numbering v Low vi cng dng nh trn, quy c Numbering[u] = 0 nu nh u


cha c thm.

Mng Stack, th tc Push, hm Pop m t cu trc ngn xp.


Input: file vn bn GRAPH.INP:

Dng u: Ghi s nh n ( 100) v s cung m ca th cch nhau mt du cch

m dng tip theo, mi dng ghi hai s nguyn u, v cch nhau mt du cch th hin c cung
(u, v) trong th
Output: file vn bn GRAPH.OUT
Lit k cc thnh phn lin thng mnh

L Minh Hong

L thuyt th

\ 32 [
1

2
8
3
4
9

10

6
11

GRAPH.INP
11 15
1 2
1 8
2 3
3 4
4 2
4 5
5 6
6 7
7 5
8 9
9 4
9 10
10 8
10 11
11 8

GRAPH.OUT
Component 1:
7, 6, 5,
Component 2:
4, 3, 2,
Component 3:
11, 10, 9, 8,
Component 4:
1,

PROG04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Numbering, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Last: Integer;
{Nhp d liu (t thit b nhp chun)}
procedure Enter;
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
end;
end;
{Khi to}
procedure Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0);
FillChar(Free, SizeOf(Free), True);
Last := 0;
Count := 0;
ComponentCount := 0;
end;

{Mi nh u cha thm}


{Cha nh no b loi}
{Ngn xp rng}
{Bin nh s th t thm}
{Bin nh s cc thnh phn lin thng}

procedure Push(v: Integer);


begin
Inc(Last);
Stack[Last] := v;
end;

{y mt nh v vo ngn xp}

function Pop: Integer;


begin
Pop := Stack[Last];
Dec(Last);
end;

{Ly mt nh khi ngn xp, tr v trong kt qu hm}

L Minh Hong

L thuyt th

\ 33 [

function Min(x, y: Integer): Integer;


begin
if x < y then Min := x else Min := y;
end;
procedure Visit(u: Integer);
{Thut ton tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count); Numbering[u] := Count; {Trc ht nh s cho u}
Low[u] := Numbering[u]; {Coi u c cung ti u, nn c th khi gn Low[u] th ny ri sau cc tiu ho dn}
Push(u);
{y u vo ngn xp}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v k u}
if Numbering[v] <> 0 then {Nu v thm}
Low[u] := Min(Low[u], Numbering[v]) {Cc tiu ho Low[u] theo cng thc ny}
else
{Nu v cha thm}
begin
Visit(v);
{Tip tc tm kim theo chiu su bt u t v}
Low[u] := Min(Low[u], Low[v]);
{Ri cc tiu ho Low[u] theo cng thc ny}
end;
{n y th nh u c duyt xong, tc l cc nh thuc nhnh DFS gc u u thm}
if Numbering[u] = Low[u] then {Nu u l cht}
begin
{Lit k thnh phn lin thng mnh c cht u}

Inc(ComponentCount);
WriteLn('Component ', ComponentCount, ': ');
repeat
v := Pop;
{Ly dn cc nh ra khi ngn xp}
Write(v, ', ');
{Lit k cc nh }
Free[v] := False; {Ri loi lun khi th}
until v = u;
{Cho ti khi ly ti nh u}
WriteLn;
end;
end;
procedure Solve;
var
u: Integer;
begin
{Thay v thm mt nh gi x v cc cung (x, v) vi mi nh v ri gi Visit(x), ta c th lm th ny cho nhanh}
{sau ny phi hu b thnh phn lin thng gm mi mt nh gi }

for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Close(Input);
Close(Output);
end.

Bi tp:
1. Phng php ci t nh trn c th ni l rt hay v hiu qu, i hi ta phi hiu r bn cht
thut ton, nu khng th rt d nhm. Trn thc t, cn c mt phng php khc d hiu hn, tuy
tnh hiu qu c km hn mt cht. Hy vit chng trnh m t phng php sau:
Vn dng thut ton tm kim theo chiu su vi th tc Visit ni u mc, nh s li cc nh t
1 ti n theo th t duyt xong, sau o chiu tt c cc cung ca th. Xt ln lt cc nh
L Minh Hong

L thuyt th

\ 34 [

theo th t t nh duyt xong sau cng ti nh duyt xong u tin, vi mi nh , ta li dng


thut ton tm kim trn th (BFS hay DFS) lit k nhng nh no n c t nh ang xt,
chnh l mt thnh phn lin thng mnh. Lu l khi lit k xong thnh phn no, ta loi ngay cc
nh ca thnh phn khi th.
Tnh ng n ca phng php c th hnh dung khng my kh khn:
Trc ht ta thm vo th nh x v cc cung (x, v) vi mi v, sau gi Visit(x) xy dng
cy DFS gc x. Hin nhin x l cht ca thnh phn lin thng ch gm mi x. Sau b nh x
khi cy DFS, cy s phn r thnh cc cy con.
nh r duyt xong sau cng chc chn l gc ca mt cy con (bi khi duyt xong n chc chn s
li v x) suy ra r l cht. Hn th na, nu mt nh u no ti c r th u cng phi thuc cy
con gc r. Bi nu gi s phn chng rng u thuc cy con khc th u phi c thm trc r (do
cy con gc r c thm ti sau cng), c ngha l khi Visit(u) th r cha thm. Vy nn r s thuc
nhnh DFS gc u, mu thun vi lp lun r l gc. T suy ra nu u ti c r th r ti c u, tc
l khi o chiu cc cung, nu r ti c nh no th nh thuc thnh phn lin thng cht r.
Loi b thnh phn lin thng vi cht r khi th. Cy con gc r li phn r thnh nhiu cy con.
Lp lun tng t nh trn vi v' l nh duyt xong sau cng.
V d:
11

10

8
6

9
2

9
10

1
11

nh s li, o chiu cc cung v duyt BFS vi cch chn cc nh xut pht ngc li vi th t duyt xong
(Th t 11, 10... 3, 2, 1)

2. Thut ton Warshall c th p dng tm bao ng ca th c hng, vy hy kim tra tnh lin
thng mnh ca mt th c hng bng hai cch: Dng cc thut ton tm kim trn th v
thut ton Warshall, sau so snh u, nhc im ca mi phng php
3. M cung hnh ch nht kch thc m x n gm cc vung n v. Trn mi k t:
O: Nu an ton
X: Nu c cm by
E: Nu l c mt nh thm him ang ng.
Duy nht ch c 1 ghi ch E. Nh thm him c th t mt i sang mt trong s cc chung
cnh vi ang ng. Mt cch i thot khi m cung l mt hnh trnh i qua cc an ton ra mt
bin. Hy ch gip cho nh thm him mt hnh trnh thot ra khi m cung

L Minh Hong

L thuyt th

\ 35 [

4. Trn mt phng vi h to Decattes vung gc cho n ng trn, mi ng trn xc nh bi


b 3 s thc (X, Y, R) y (X, Y) l to tm v R l bn knh. Hai ng trn gi l thng
nhau nu chng c im chung. Hy chia cc ng trn thnh mt s ti thiu cc nhm sao cho
hai ng trn bt k trong mt nhm bt k c th i c sang nhau sau mt s hu hn cc bc
di chuyn gia hai ng trn thng nhau.

L Minh Hong

L thuyt th

\ 36 [

5. VI NG DNG CA CC THUT TON TM KIM TRN TH


I. XY DNG CY KHUNG CA TH
Cy l th v hng, lin thng, khng c chu trnh n. th v hng khng c chu trnh
n gi l rng (hp ca nhiu cy). Nh vy mi thnh phn lin thng ca rng l mt cy.
Khi nim cy c s dng rng ri trong nhiu lnh vc khc nhau: Nghin cu cu trc cc phn
t hu c, xy dng cc thut ton t chc th mc, cc thut ton tm kim, lu tr v nn d
liu...
1. nh l (Daisy Chain Theorem)
Gi s T = (V, E) l th v hng vi n nh. Khi cc mnh sau l tng ng:
1. T l cy
2. T khng cha chu trnh n v c n - 1 cnh
3. T lin thng v mi cnh ca n u l cu
4. Gia hai nh bt k ca T u tn ti ng mt ng i n
5. T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt chu trnh n.
6. T lin thng v c n - 1 cnh
Chng minh:
12: "T l cy" "T khng cha chu trnh n v c n - 1 cnh"
T T l cy, theo nh ngha T khng cha chu trnh n. Ta s chng minh cy T c n nh th
phi c n - 1 cnh bng quy np theo s nh n. R rng khi n = 1 th cy c 1 nh s cha 0 cnh.
Nu n > 1 th do th hu hn nn s cc ng i n trong T cng hu hn, gi P = (v1, v2, ...,
vk) l mt ng i di nht (qua nhiu cnh nht) trong T. nh v1 khng th c cnh ni vi nh
no trong s cc nh v3, v4, ..., vk. Bi nu c cnh (v1, vp) (3 p k) th ta s thit lp c chu
trnh n (v1, v2, ..., vp, v1). Mt khc, nh v1 cng khng th c cnh ni vi nh no khc ngoi
cc nh trn P trn bi nu c cnh (v1, v0) (v0P) th ta thit lp c ng i (v0, v1, v2, ..., vk)
di hn ng i P. Vy nh v1 ch c ng mt cnh ni vi v2 hay v1 l nh treo. Loi b v1 v
cnh (v1, v2) khi T ta c th mi cng l cy v c n - 1 nh, cy ny theo gi thit quy np
c n - 2 cnh. Vy cy T c n - 1 cnh.
23: "T khng cha chu trnh n v c n - 1 cnh""T lin thng v mi cnh ca n u
l cu"
Gi s T c k thnh phn lin thng T1, T2, ..., Tk. V T khng cha chu trnh n nn cc thnh
phn lin thng ca T cng khng cha chu trnh n, tc l cc T1, T2, ..., Tk u l cy. Gi n1, n2,
..., nk ln lt l s nh ca T1, T2, ..., Tk th cy T1 c n1 - 1 cnh, cy T2 c n2 - 1 cnh..., cy Tk
c nk - 1 cnh. Cng li ta c s cnh ca T l n1 + n2 + ... + nk - k = n - k cnh. Theo gi thit, cy
T c n - 1 cnh, suy ra k = 1, th ch c mt thnh phn lin thng l th lin thng.
By gi khi T lin thng, nu b i mt cnh ca T th T s cn n - 2 cnh v s khng lin
thng bi nu T vn lin thng th do T khng c chu trnh nn T s l cy v c n - 1 cnh. iu
chng t mi cnh ca T u l cu.
34: "T lin thng v mi cnh ca n u l cu""Gia hai nh bt k ca T c ng
mt ng i n"
Gi x v y l 2 nh bt k trong T, v T lin thng nn s c mt ng i n t x ti y. Nu tn
ti mt ng i n khc t x ti y th nu ta b i mt cnh (u, v) nm trn ng i th nht
nhng khng nm trn ng i th hai th t u vn c th n c v bng cch: i t u i theo
L Minh Hong

L thuyt th

\ 37 [

chiu ti x theo cc cnh thuc ng th nht, sau i t x ti y theo ng th hai, ri li i t


y ti v theo cc cnh thuc ng i th nht. iu ny mu thun vi gi thit (u, v) l cu.
45: "Gia hai nh bt k ca T c ng mt ng i n""T khng cha chu trnh
n nhng h c thm vo mt cnh ta thu c mt chu trnh n"
Th nht T khng cha chu trnh n v nu T cha chu trnh n th chu trnh qua t nht hai
nh u, v. R rng dc theo cc cnh trn chu trnh th t u c hai ng i n ti v. V l.
Gia hai nh u, v bt k ca T c mt ng i n ni u vi v, vy khi thm cnh (u, v) vo
ng i ny th s to thnh chu trnh.
56: "T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt chu
trnh n""T lin thng v c n - 1 cnh"
Gi u v v l hai nh bt k trong T, thm vo T mt cnh (u, v) na th theo gi thit s to thnh
mt chu trnh cha cnh (u, v). Loi b cnh ny i th phn cn li ca chu trnh s l mt ng
i t u ti v. Mi cp nh ca T u c mt ng i ni chng tc l T lin thng, theo gi thit T
khng cha chu trnh n nn T l cy v c n - 1 cnh.
61: "T lin thng v c n - 1 cnh""T l cy"
Gi s T khng l cy th T c chu trnh, hu b mt cnh trn chu trnh ny th T vn lin thng,
nu th mi nhn c vn c chu trnh th li hu mt cnh trong chu trnh mi. C nh th cho
ti khi ta nhn c mt th lin thng khng c chu trnh. th ny l cy nhng li c < n - 1
cnh (v l). Vy T l cy
2. nh ngha
Gi s G = (V, E) l th v hng. Cy T = (V, F) vi FE gi l cy khung ca th G. Tc l
nu nh loi b mt s cnh ca G c mt cy th cy gi l cy khung (hay cy bao trm
ca th).
D thy rng vi mt th v hng lin thng c th c nhiu cy khung.

T1
T2
Hnh 13: th G v mt s v d cy khung T1, T2, T3 ca n

T3

iu kin cn v mt th v hng c cy khung l th phi lin thng


S cy khung ca th y Kn l nn-2.

3. Thut ton xy dng cy khung


Xt th v hng lin thng G = (V, E) c n nh, c nhiu thut ton xy dng cy khung ca G
a) Xy dng cy khung bng thut ton hp nht
Trc ht, t T = (V, ); T khng cha cnh no th c th coi T gm n cy ri rc, mi cy ch c
1 nh. Sau xt ln lt cc cnh ca G, nu cnh ang xt ni hai cy khc nhau trong T th
thm cnh vo T, ng thi hp nht hai cy li thnh mt cy. C lm nh vy cho ti khi
kt np n - 1 cnh vo T th ta c T l cy khung ca th. Cc phng php kim tra cnh

L Minh Hong

L thuyt th

\ 38 [

c ni hai cy khc nhau hay khng cng nh k thut hp nht hai cy s c bn k hn trong
thut ton Kruskal 9.
b) Xy dng cy khung bng cc thut ton tm kim trn th.
p dng thut ton BFS hay DFS bt u t nh S, ti mi bc t nh u ti thm nh v, ta thm
vo thao tc ghi nhn lun cnh (u, v) vo cy khung. Do th lin thng nn thut ton s xut
pht t S v ti thm tt c cc nh cn li, mi nh ng mt ln, tc l qu trnh duyt s ghi
nhn c ng n - 1 cnh. Tt c nhng cnh khng to thnh chu trnh n bi thut ton
khng thm li nhng nh thm. Theo mnh tng ng th hai, ta c nhng cnh ghi nhn
c to thnh mt cy khung ca th.
1

10

11

10

11

Hnh 14: Cy khung DFS v cy khung BFS (Mi tn ch chiu i thm cc nh)

II. TP CC CHU TRNH C BN CA TH


Xt mt th v hng lin thng G = (V, E); gi T = (V, F) l mt cy khung ca n. Cc cnh
ca cy khung c gi l cc cnh trong, cn cc cnh khc l cc cnh ngoi.
Nu thm mt cnh ngoi eE \ F vo cy khung T, th ta c ng mt chu trnh n trong T, k
hiu chu trnh ny l Ce. Tp cc chu trnh:
= {Ce eE \ F}
c gi l tp cc chu trnh c s ca th G.
Cc tnh cht quan trng ca tp cc chu trnh c s:
1. Tp cc chu trnh c s l ph thuc vo cy khung, hai cy khung khc nhau c th cho hai
tp chu trnh c s khc nhau.
2. Nu th lin thng c n nh v m cnh, th trong cy khung c n - 1 cnh, cn li m - n + 1
cnh ngoi. Tng ng vi mi cnh ngoi c mt chu trnh c s, vy s chu trnh c s ca
th lin thng l m - n + 1.
3. Tp cc chu trnh c s l tp nhiu nht cc chu trnh tho mn: Mi chu trnh c ng mt
cnh ring, cnh khng nm trong bt c mt chu trnh no khc. Bi nu c mt tp gm t
chu trnh tho mn iu th vic loi b cnh ring ca mt chu trnh s khng lm mt tnh
lin thng ca th, ng thi khng nh hng ti s tn ti ca cc chu trnh khc. Nh vy
nu loi b tt c cc cnh ring th th vn lin thng v cn m - t cnh. th lin thng th
khng th c t hn n - 1 cnh nn ta c m - t n - 1 hay t m - n + 1.
4. Mi cnh trong mt chu trnh n bt k u phi thuc mt chu trnh c s. Bi nu c
mt cnh (u, v) khng thuc mt chu trnh c s no, th khi ta b cnh i th vn lin
thng v khng nh hng ti s tn ti ca cc chu trnh c s. Li b tip nhng cnh ngoi
L Minh Hong

L thuyt th

\ 39 [

ca cc chu trnh c s th th vn lin thng v cn li m - (m - n + 1) - 1 = n - 2 cnh. iu


ny v l.
5. i vi th G = (V, E) c n nh v m cnh, c k thnh phn lin thng, ta c th xt cc
thnh phn lin thng v xt rng cc cy khung ca cc thnh phn . Khi c th m rng
khi nim tp cc chu trnh c s cho th v hng tng qut: Mi khi thm mt cnh khng
nm trong cc cy khung vo rng, ta c ng mt chu trnh n, tp cc chu trnh n to
thnh bng cch ghp cc cnh ngoi nh vy gi l tp cc chu trnh c s ca th G. S cc
chu trnh c s l m - n + k.
III. NH CHIU TH V BI TON LIT K CU
Bi ton t ra l cho mt th v hng lin thng G = (V, E), hy thay mi cnh ca th bng
mt cung nh hng c mt th c hng lin thng mnh. Nu c phng n nh chiu
nh vy th G c gi l th nh chiu c. Bi ton nh chiu th c ng dng r nht
trong s giao thng ng b. Chng hn nh tr li cu hi: Trong mt h thng ng ph,
liu c th quy nh cc ng ph thnh ng mt chiu m vn m bo s i li gia hai
nt giao thng bt k hay khng.
1. Php nh chiu DFS
Xt m hnh duyt th bng thut ton tm kim theo chiu su bt u t nh 1. V th l v
hng lin thng nn qu trnh tm kim s thm c ht cc nh.
procedure Visit(u V);
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;
begin
<nh du mi nh u cha thm>;
Visit(1);
end;

Coi mt cnh ca th tng ng vi hai cung c hng ngc chiu nhau. Thut ton tm
kim theo chiu su theo m hnh trn s duyt qua ht cc nh ca th v tt c cc cung na.
Qu trnh duyt cho ta mt cy tm kim DFS. Ta c cc nhn xt sau:
Nhn xt 1:
Qu trnh duyt s khng c cung cho (cung i t mt nhnh DFS thm sau ti nhnh DFS thm
trc). Tht vy, nu qu trnh duyt xt ti mt cung (u, v):
Nu u thm trc v c ngha l khi Visit(u) c gi th v cha thm, v th tc Visit(u) s xy
dng nhnh DFS gc u gm nhng nh cha thm n c t u, suy ra v nm trong nhnh
DFS gc u v l hu du ca u, hay (u, v) l cung DFS hoc cung xui.
Nu u thm sau v (v thm trc u), tng t trn, ta suy ra u nm trong nhnh DFS gc v, v l
tin bi ca u (u, v) l cung ngc.
Nhn xt 2:
Trong qu trnh duyt th theo chiu su, nu c duyt qua cung (u, v) no th ta b i cung (v,
u). (Tc l h duyt qua cung (u, v) th ta nh chiu lun cnh (u, v) theo chiu t u ti v), ta c
mt php nh chiu th gi l php nh chiu DFS.

L Minh Hong

L thuyt th

\ 40 [
1

2
3

10

10

Hnh 15: Php nh chiu DFS

Nhn xt 3:
Vi php nh chiu nh trn, th s ch cn cc cung trn cy DFS v cung ngc, khng cn li
cung xui. Bi trn th v hng ban u, nu ta coi mt cnh l hai cung c hng ngc chiu
nhau th vi mt cung xui ta c cung ngc chiu vi n l cung ngc. Do tnh cht DFS, cung
ngc c duyt trc cung xui tng ng, nn khi nh chiu cnh theo cung ngc th cung
xui s b hu v khng b xt ti na.
Nhn xt 4:
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l cnh ngoi ca cy
khung DFS. Chnh v vy, mi chu trnh c s trong th v hng ban u vn s l chu
trnh trong th c hng to ra. (y l mt phng php hiu qu lit k cc chu trnh c s
ca cy khung DFS: Va duyt DFS va nh chiu, nu duyt phi cung ngc (u, v) th truy vt
ng i ca DFS tm ng t v n u, sau ni thm cung ngc (u, v) c mt chu
trnh c s).
nh l: iu kin cn v mt th v hng lin thng c th nh chiu c l mi
cnh ca th nm trn t nht mt chu trnh n (Hay ni cch khc mi cnh ca th u
khng phi l cu).
Chng minh:
Gi G = (V, E) l mt th v hng lin thng.
""
Nu G l nh chiu c th sau khi nh hng s c th lin thng mnh G'. Vi mt cnh
c nh chiu thnh cung (u, v) th s tn ti mt ng i n trong G' theo cc cnh nh
hng t v v u. ng i ni thm cung (u, v) s thnh mt chu trnh n c hng trong G'.
Tc l trn th ban u, cnh (u, v) nm trn mt chu trnh n.
""
Nu mi cnh ca G u nm trn mt chu trnh n, ta s chng minh rng: php nh chiu DFS
s to ra th G' lin thng mnh.
Trc ht ta chng minh rng nu (u, v) l cnh ca G th s c mt ng i t u ti v trong
G'. Tht vy, v (u, v) nm trong mt chu trnh n, m mi cnh ca mt chu trnh n u
phi thuc mt chu trnh c s no , nn s c mt chu trnh c s cha c u v v. Chu trnh

L Minh Hong

L thuyt th

\ 41 [

c s qua php nh chiu DFS vn l chu trnh trong G' nn i theo cc cnh nh hng ca
chu trnh , ta c th i t u ti v v ngc li.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=x0, x1, ..., xn=v).
V (xi, xi + 1) l cnh ca G nn trong G', t xi c th n c xi+1. Suy ra t u cng c th n
c v bng cc cnh nh hng ca G'.

2. Ci t
Vi nhng kt qu chng minh trn, ta cn suy ra c: Nu th lin thng v mi cnh ca
n nm trn t nht mt chu trnh n th php nh chiu DFS s cho mt th lin thng mnh.
Cn nu khng, th php nh chiu DFS s cho mt th nh hng c t thnh phn lin thng
mnh nht, mt cnh khng nm trn mt chu trnh n no (cu) ca th ban u s c nh
hng thnh cung ni gia hai thnh phn lin thng mnh.
Ta s ci t mt thut ton vi mt th v hng: lit k cc cu v nh chiu cc cnh
c mt th mi c t thnh phn lin thng mnh nht:
nh s cc nh theo th t thm DFS, gi Numbering[u] l s th t ca nh u theo cch nh
s . Trong qu trnh tm kim DFS, duyt qua cnh no nh chiu lun cnh . nh ngha
thm Low[u] l gi tr Numbering nh nht ca nhng nh n c t nhnh DFS gc u bng mt
cung ngc. Tc l nu nhnh DFS gc u c nhiu cung ngc hng ln trn pha gc cy th ta
ghi nhn li cung ngc hng ln cao nht. Nu nhnh DFS gc u khng cha cung ngc th ta
cho Low[u] = +. C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u (Numbering[u]) v khi gn
Low[u] = +.
Sau , xt tt c nhng nh v k u, nh chiu cnh (u, v) thnh cung (u, v). C hai kh nng
xy ra:
v cha thm th ta gi Visit(v) thm v v cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Low[v])
v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Numbering[v])
D thy cch tnh nh vy l ng n bi nu v cha thm th nhnh DFS gc v nm trong
nhnh DFS gc u v nhng cung ngc trong nhnh DFS gc v cng l cung ngc trong nhnh
DFS gc u. Cn nu v thm th (u, v) s l cung ngc.
1 1

1
1

2
1

3
4

3 8

5
4

9
10 3

8
6

10

th v hng

7 5

th nh chiu, Gi tr Numbering[u] ghi trong vng trn,


Gi tr Low[u] ghi bn cnh
Hnh 16: Php nh s v ghi nhn cung ngc ln cao nht

L Minh Hong

L thuyt th

\ 42 [

Nu t nh u ti thm nh v, (u, v) l cung DFS. Khi nh v c duyt xong, li v th tc


Visit(u), ta so snh Low[v] v Numbering[u]. Nu Low[v] > Numbering[u] th tc l nhnh DFS
gc v khng c cung ngc thot ln pha trn v. Tc l cnh (u, v) khng thuc mt chu trnh c
s no c, tc cnh l cu.
{ th G = (V, E)}
procedure Visit(uV);
begin
<nh s th t thm cho nh u (Numbering[u]); Khi gn Low[u] := +>;
for (v: (u, v)E) do
begin
<nh chiu cnh (u, v) thnh cung (u, v) Loi b cung (v, u)>;
if <v cha thm> then
begin
Visit(v);
if Low[v] > Numbering[u] then <In ra cu (u, v)>;
Low[u] := Min(Low[u], Low[v]);
{Cc tiu ho Low[u] theo Low[v]}
end
else {v thm}
Low[u] := Min(Low[u], Numbering[v]);
{Cc tiu ho Low[u] theo Numbering[v]}
end;
end;
begin
for (uV) do
if <u cha thm> then Visit(u);
<In ra cch nh chiu>;
end.

Input: file vn bn GRAPH.INP


Dng 1 ghi s nh n (n 100) v s cnh m ca th cch nhau t nht mt du cch
m dng tip theo, mi dng ghi hai s nguyn dng u, v cch nhau t nht mt du cch, cho
bit th c cnh ni nh u vi nh v
Output: file vn bn GRAPH.OUT
Thng bo cc cu v php nh chiu c t thnh phn lin thng mnh nht

1
3

2
4

10

11

GRAPH.INP
11 14
1 2
1 3
2 3
2 4
4 5
4 6
4 9
5 7
5 10
6 8
7 10
7 11
8 9
10 11

GRAPH.OUT
Bridges:
(4, 5)
(2, 4)
Directed Edges:
1 -> 2
2 -> 3
2 -> 4
3 -> 1
4 -> 5
4 -> 6
5 -> 7
6 -> 8
7 -> 10
8 -> 9
9 -> 4
10 -> 5
10 -> 11
11 -> 7

PROG05_1.PAS * Php nh chiu DFS v lit k cu


program Directivity_and_Bridges;
L Minh Hong

L thuyt th

\ 43 [

const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Numbering, Low: array[1..max] of Integer;
n, Count: Integer;
procedure Enter;
var
f: Text;
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
Assign(f, 'GRAPH.INP'); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
procedure Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {Numbering[u] = 0 u cha thm}
Count := 0;
end;
procedure Visit(u: Integer);
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; {nh s th t thm cho nh u, u tr thnh thm}
Low[u] := n + 1;
{Khi gn Low[u] bng mt gi tr ln hn tt c Numbering}
for v := 1 to n do
if a[u, v] then {Xt mi nh v k u}
begin
a[v, u] := False;
{nh chiu cnh (u, v) thnh cung (u, v)}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Visit(v);
{i thm v}
if Low[v] > Numbering[u] then {(u, v) l cu}
WriteLn('(', u, ', ', v, ')');
if Low[u] > Low[v] then Low[u] := Low[v];
{Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;
end;
procedure Solve;
var
u, v: Integer;
begin
WriteLn('Bridges: ');
{Dng DFS nh chiu th v lit k cu}
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
WriteLn('Directed Edges: ');
{Qut li ma trn k in ra cc cnh nh hng}
for u := 1 to n do
for v := 1 to n do
if a[u, v] then WriteLn(u, ' -> ', v);
L Minh Hong

L thuyt th

\ 44 [

end;
begin
Enter;
Init;
Solve;
end.

IV. LIT K KHP


Trong th v hng, Mt nh C c gi l khp, nu nh ta b i nh C v cc cnh lin
thuc vi n th s lm tng s thnh phn lin thng ca th. Bi ton t ra l phi lit k ht
cc khp ca th.
R rng theo cch nh ngha trn, cc nh treo v nh c lp s khng phi l khp. th lin
thng c 3 nh, khng c khp (cho d b i nh no th vn lin thng) c gi l th
song lin thng. Gia hai nh phn bit ca th song lin thng, tn ti t nht 2 ng i khng
c nh trung gian no chung.
Coi mi cnh ca th ban u l hai cung c hng ngc chiu nhau v dng php duyt th
theo chiu su:
{ th G = (V, E)}
procedure Visit(u V): V;
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;
begin
<nh du mi nh u cha thm>;
for (uV) do
if <u cha thm> then Visit(u);
end;

Qu trnh duyt cho mt rng cc cy DFS. Cc cung duyt qua c ba loi: cung DFS, cung ngc
v cung xui, khng b ri hnh, ta ch u tin v cung DFS hoc cung ngc:

11

2
3
12
4

13

10

17

14

15

16

Hnh 17: Duyt DFS, xc nh cy DFS v cc cung ngc

Hy nhnh DFS gc nh r no
Nu mi nhnh con ca nhnh DFS gc r u c mt cung ngc ln ti mt tin bi ca r th r
khng l khp. Bi nu trong th ban u, ta b r i th t mi nh bt k ca nhnh con, ta
L Minh Hong

L thuyt th

\ 45 [

vn c th i ln mt tin bi ca r, ri i sang nhnh con khc hoc i sang tt c nhng nh


cn li ca cy. S thnh phn lin thng ca th khng thay i.
Nu r khng phi l gc ca mt cy DFS, v tn ti mt nhnh con ca nhnh DFS gc r
khng c cung ngc ln mt tin bi ca r th r l khp. Bi khi , tt c nhng cung xut
pht t nhnh con ch i ti nhng nh ni b trong nhnh DFS gc r m thi, trn th
ban u, khng tn ti cnh ni t nhng nh thuc nhnh con ti mt tin bi ca r. Vy t
nhnh mun i ln mt tin bi ca r, tt phi i qua r. Hu r khi th s lm mt tt c
cc ng i , tc l lm tng s thnh phn lin thng ca th.
Nu r l gc ca mt cy DFS, th r l khp khi v ch khi r c t nht hai nhnh con. Bi khi r
c 2 nhnh con th ng i gia hai nh thuc hai nhnh con tt phi i qua r.
Vy th thut ton lit k khp li l nhng k thut quen thuc, duyt DFS, nh s, ghi nhn
cnh ngc ln cao nht t mt nhnh con, ch thm vo mt thao tc nh: Nu t nh u gi
quy thm nh v ((u, v) l cung DFS) th sau khi duyt xong nh v, li v th tc Visit(u), ta
so snh Low[v] v Numbering[u] kim tra xem t nhnh con gc v c cnh ngc no ln
tin bi ca u hay khng, nu khng c th tm thi nh du u l khp. Cui cng phi kim
tra li iu kin: nu u l gc cy DFS th n l khp khi v ch khi n c t nht 2 nhnh con,
nu khng tho mn iu kin th nh du li u khng l khp.
Input: file vn bn GRAPH.INP vi khun dng nh bi ton lit k cu
Output: Danh sch cc khp ca th
2
1

5
4
10

9
8

13

7
11

12

GRAPH.INP
13 15
1 3
2 4
2 5
3 6
3 7
4 8
4 11
5 9
5 10
6 7
8 11
8 12
9 10
9 13
11 12

GRAPH.OUT
Cut vertices:
2, 3, 4, 5, 9,

PROG05_2.PAS * Lit k cc khp ca th


program CutVertices;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Numbering, Low, nC: array[1..max] of Integer; {nC[u]: S nhnh con ca nhnh DFS gc u}
Mark: array[1..max] of Boolean;
{Mark[u] = True u l khp}
n, Count: Integer;
procedure LoadGraph;
{Nhp th (t thit b nhp chun Input)}
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);

L Minh Hong

L thuyt th

\ 46 [

ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True; a[v, u] := True;
end;
end;
procedure Visit(u: Integer);
{Tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; Low[u] := n + 1; nC[u] := 0;
Mark[u] := False;
for v := 1 to n do
if a[u, v] then
{Xt mi v k u}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Inc(nc[u]);
{Tng bin m s con ca u ln 1}
Visit(v);
{Thm v}
{Nu nhnh DFS gc v khng c cung ngc ln mt tin bi ca u tc l Low[v] Numbering[u]}

Mark[u] := Mark[u] or (Low[v] >= Numbering[u]);


{Tm nh du u l khp}
if Low[u] > Low[v] then Low[u] := Low[v];
{Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;
procedure Solve;
var
u: Integer;
begin
FillChar(Numbering, SizeOf(Numbering), 0);
{nh s = 0 nh cha thm}
FillChar(Mark, SizeOf(Mark), False);
{Mng nh du khp cha c g}
Count := 0;
for u := 1 to n do
if Numbering[u] = 0 then
{Xt mi nh u cha thm}
begin
Visit(u);
{Thm u, xy dng cy DFS gc u}
if nC[u] < 2 then
{Nu u c t hn 2 con}
Mark[u] := False;
{Th u khng phi l khp}
end;
end;
procedure Result;
{Da vo mng nh du lit k cc khp}
var
i: Integer;
begin
WriteLn('Cut vertices:');
for i := 1 to n do
if Mark[i] then Write(i, ', ');
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
LoadGraph;
Solve;
Result;
Close(Input);
Close(Output);
end.

L Minh Hong

L thuyt th

\ 47 [

6. CHU TRNH EULER, NG I EULER, TH EULER

I. BI TON 7 CI CU
Thnh ph Konigsberg thuc Ph (nay l Kaliningrad thuc Cng ho Nga), c chia lm 4 vng
bng cc nhnh sng Pregel. Cc vng ny gm 2 vng bn b sng (B, C), o Kneiphof (A) v
mt min nm gia hai nhnh sng Pregel (D). Vo th k XVIII, ngi ta xy 7 chic cu ni
nhng vng ny vi nhau. Ngi dn y t hi: Liu c cch no xut pht ti mt a im
trong thnh ph, i qua 7 chic cu, mi chic ng 1 ln ri quay tr v ni xut pht khng ?
Nh ton hc Thy s Leonhard Euler gii bi ton ny v c th coi y l ng dng u tin
ca L thuyt th, ng m hnh ho s 7 ci cu bng mt a th, bn vng c biu
din bng 4 nh, cc cu l cc cnh. Bi ton tm ng qua 7 cu, mi cu ng mt ln c th
tng qut ho bng bi ton: C tn ti chu trnh n trong a th cha tt c cc cnh ?.
C

B
B

Hnh 18: M hnh th ca bi ton by ci cu

II. NH NGHA
1. Chu trnh n cha tt c cc cnh ca th c gi l chu trnh Euler
2. ng i n cha tt c cc cnh ca th c gi l ng i Euler
3. Mt th c chu trnh Euler c gi l th Euler
4. Mt th c ng i Euler c gi l th na Euler.
R rng mt th Euler th phi l na Euler nhng iu ngc li th khng phi lun ng
III. NH L
1. Mt th v hng lin thng G = (V, E) c chu trnh Euler khi v ch khi mi nh ca n
u c bc chn: deg(v) 0 (mod 2) (vV)
2. Mt th v hng lin thng c ng i Euler nhng khng c chu trnh Euler khi v
ch khi n c ng 2 nh bc l
3. Mt thi c hng lin thng yu G = (V, E) c chu trnh Euler th mi nh ca n c bn
bc ra bng bn bc vo: deg+(v) = deg-(v) (vV); Ngc li, nu G lin thng yu v mi
nh ca n c bn bc ra bng bn bc vo th G c chu trnh Euler, hay G s l lin thng
mnh.
4. Mt th c hng lin thng yu G = (V, E) c ng i Euler nhng khng c chu trnh
Euler nu tn ti ng hai nh u, v V sao cho deg+(u) - deg-(u) = deg-(v) - deg+(v) = 1, cn
tt c nhng nh khc u v v u c bn bc ra bng bn bc vo.

L Minh Hong

L thuyt th

\ 48 [

IV. THUT TON FLEURY TM CHU TRNH EULER


1. i vi th v hng lin thng, mi nh u c bc chn.
Xut pht t mt nh, ta chn mt cnh lin thuc vi n i tip theo hai nguyn tc sau:
Xo b cnh i qua
Ch i qua cu khi khng cn cnh no khc chn
V ta c chn cnh i mt cch thoi mi nh vy cho ti khi khng i tip c na, ng i tm
c l chu trnh Euler.
V d: Vi th sau:
5

2
7

7
1

8
3

8
3

Nu xut pht t nh 1, c hai cch i tip: hoc sang 2 hoc sang 3, gi s ta s sang 2 v xo
cnh (1, 2) va i qua. T 2 ch c cch duy nht l sang 4, nn cho d (2, 4) l cu ta cng phi i
sau xo lun cnh (2, 4). n y, cc cnh cn li ca th c th v nh trn bng nt lin,
cc cnh b xo c v bng nt t.
By gi ang ng nh 4 th ta c 3 cch i tip: sang 3, sang 5 hoc sang 6. V (4, 3) l cu nn
ta s khng i theo cnh (4, 3) m s i (4, 5) hoc (4, 6). Nu i theo (4, 5) v c tip tc i nh
vy, ta s c chu trnh Euler l (1, 2, 4, 5, 7, 8, 6, 4, 3, 1). Cn i theo (4, 6) s tm c chu trnh
Euler l: (1, 2, 4, 6, 8, 7, 5, 4, 3, 1).
2. i vi th c hng lin thng yu, mi nh u c bn bc ra bng bn bc vo.
Bng cch "lm dng thut ng", ta c th m t c thut ton tm chu trnh Euler cho c th
c hng cng nh v hng:
Th nht, di y nu ta ni cnh (u, v) th hiu l cnh ni nh u v nh v trn th v
hng, hiu l cung ni t nh u ti nh v trn th c hng.
Th hai, ta gi cnh (u, v) l "mt i khng tr li" nu nh t u ta i ti v theo cnh , sau
xo cnh i th khng c cch no t v quay li u.
Vy th thut ton Fleury tm chu trnh Euler c th m t nh sau:
Xut pht t mt nh, ta i mt cch tu theo cc cnh tun theo hai nguyn tc: Xo b cnh
va i qua v ch chn cnh "mt i khng tr li" nu nh khng cn cnh no khc chn.
V. CI T
Ta s ci t thut ton Fleury trn mt a th v hng. n gin, ta coi th ny c chu
trnh Euler, cng vic ca ta l tm ra chu trnh thi. Bi vic kim tra tnh lin thng cng nh
kim tra mi nh u c bc chn n gi c th coi l chuyn nh.
Input: file vn bn EULER.INP
Dng 1: Cha s nh n ca th (n 100)
Cc dng tip theo, mi dng cha 3 s nguyn dng cch nhau t nht 1 du cch c dng: u
v k cho bit gia nh u v nh v c k cnh ni
Output: file vn bn EULER.OUT ghi chu trnh EULER
L Minh Hong

L thuyt th

\ 49 [

EULER.INP
4
1 2 1
1 3 2
1 4 1
2 3 1
3 4 1

EULER.OUT
1
2

PROG06_1.PAS * Thut ton Fleury tm chu trnh Euler


program Euler_Circuit;
const
max = 100;
var
a: array[1..max, 1..max] of Integer;
n: Integer;
procedure Enter;
{Nhp d liu t thit b nhp chun Input}
var
u, v, k: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n);
while not SeekEof do
begin
ReadLn(u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
end;
{Th tc ny kim tra nu xo mt cnh ni (x, y) th y c cn quay li c x hay khng}

function CanGoBack(x, y: Integer): Boolean;


var
Queue: array[1..max] of Integer; {Hng i dng cho Breadth First Search}
First, Last: Integer; {First: Ch s u hng i, Last: Ch s cui hng i}
u, v: Integer;
Free: array[1..max] of Boolean;
{Mng nh du}
begin
Dec(a[x, y]); Dec(a[y, x]);
{Th xo mt cnh (x, y) S cnh ni (x, y) gim 1}
FillChar(Free, n, True);
{sau p dng BFS xem t y c quay li x c khng ?}
Free[y] := False;
First := 1; Last := 1;
Queue[1] := y;
repeat
u := Queue[First]; Inc(First);
for v := 1 to n do
if Free[v] and (a[u, v] > 0) then
begin
Inc(Last);
Queue[Last] := v;
Free[v] := False;
if Free[x] then Break;
end;
until First > Last;
CanGoBack := not Free[x];
Inc(a[x, y]); Inc(a[y, x]); { trn th xo cnh th gi phi phc hi}
end;
procedure FindEulerCircuit; {Thut ton Fleury}
var
Current, Next, v, count: Integer;

L Minh Hong

L thuyt th

\ 50 [

begin
Current := 1;
Write(1:5); {Bt u t nh Current = 1}
count := 1;
repeat
Next := 0;
for v := 1 to n do
if a[Current, v] > 0 then
begin
Next := v;
if CanGoBack(Current, Next) then Break;
end;
if Next <> 0 then
begin
Dec(a[Current, Next]);
Dec(a[Next, Current]);
{Xo b cnh va i qua}
Write(Next:5);
{In kt qu i ti Next}
Inc(count);
if count mod 16 = 0 then WriteLn; {In ra ti a 16 nh trn mt dng}
Current := Next;
{Li tip tc vi nh ang ng l Next}
end;
until Next = 0; {Cho ti khi khng i tip c na}
WriteLn;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.

VI. THUT TON TT HN


Trong trng hp th Euler c s cnh nh, ta c th s dng phng php sau tm chu
trnh Euler trong th v hng: Bt u t mt chu trnh n C bt k, chu trnh ny tm c
bng cch xut pht t mt nh, i tu theo cc cnh cho ti khi quay v nh xut pht, lu l
i qua cnh no xo lun cnh . Nu nh chu trnh C tm c cha tt c cc cnh ca th th
l chu trnh Euler. Nu khng, xt cc nh dc theo chu trnh C, nu cn c cnh cha xo lin
thuc vi mt nh u no th li t u, ta i tu theo cc cnh cng theo nguyn tc trn cho ti
khi quay tr v u, c mt chu trnh n khc qua u. Loi b v tr u khi chu trnh C v chn
vo C chu trnh mi tm c ti ng v tr ca u va xo, ta c mt chu trnh n C' mi ln
hn chu trnh C. C lm nh vy cho ti khi c chu trnh Euler. Vic chng minh tnh ng n
ca thut ton cng l chng minh nh l v iu kin cn v mt th v hng lin thng
c chu trnh Euler.
M hnh thut ton c th vit nh sau:
<Khi to mt ngn xp Stack ban u ch gm mi nh 1>;
<M t cc phng thc Push (y vo) v Pop(ly ra) mt nh t ngn xp Stack,
phng thc Get cho bit phn t nm nh Stack. Khc vi Pop, phng thc Get
ch cho bit phn t nh Stack ch khng ly phn t ra>;
while Stack do
begin
x := Get;
if <Tn ti nh y m (x, y)E> then {T x cn i hng khc c}
begin
Push(y);

L Minh Hong

L thuyt th

\ 51 [

<Loi b cnh (x, y) khi th>;


end
else {T x khng i tip c ti u na}
begin
x := Pop;
<In ra nh x trn ng i Euler>;
end;
end;

Thut ton trn c th dng tm chu trnh Euler trong th c hng lin thng yu, mi nh
c bn bc ra bng bn bc vo. Tuy nhin th t cc nh in ra b ngc so vi cc cung nh
hng, ta c th o ngc hng cc cung trc khi thc hin thut ton c th t ng.
Thut ton hot ng vi hiu qu cao, d ci t, nhng trng hp xu nht th Stack s phi cha
ton b danh sch nh trn chu trnh Euler chnh v vy m khi a th c s cnh qu ln th s
khng khng gian nh m t Stack (Ta c th vi th ch gm 2 nh nhng gia hai nh
c ti 106 cnh ni s thy ngay). L do thut ton ch c th p dng trong trng hp s cnh c
gii hn bit trc nh l nh vy.
PROG06_2.PAS * Thut ton hiu qu tm chu trnh Euler
program Euler_Circuit;
const
max = 100;
maxE = 20000;
{S cnh ti a}
var
a: array[1..max, 1..max] of Integer;
stack: array[1..maxE] of Integer;
n, last: Integer;
procedure Enter;
{Nhp d liu}
var
u, v, k: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n);
while not SeekEof do
begin
ReadLn(u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
end;
procedure Push(v: Integer); {y mt nh v vo ngn xp}
begin
Inc(last);
Stack[last] := v;
end;
function Pop: Integer;
begin
Pop := Stack[last];
Dec(last);
end;

{Ly mt nh khi ngn xp, tr v trong kt qu hm}

function Get: Integer;


begin
Get := Stack[last];
end;

{Tr v phn t nh (Top) ngn xp}

procedure FindEulerCircuit;
var

L Minh Hong

L thuyt th

\ 52 [

u, v, count: Integer;
begin
Stack[1] := 1;
{Khi to ngn xp ban u ch gm nh 1}
last := 1;
count := 0;
while last <> 0 do {Chng no ngn xp cha rng}
begin
u := Get;
{Xc nh u l phn t nh ngn xp}
for v := 1 to n do
if a[u, v] > 0 then {Xt tt c cc cnh lin thuc vi u, nu thy}
begin
Dec(a[u, v]); Dec(a[v, u]);
{Xo cnh khi th}
Push(v);
{y nh tip theo vo ngn xp}
Break;
end;
if u = Get then
{Nu phn t nh ngn xp vn l u vng lp trn khng tm thy nh no k vi u}
begin
Inc(count);
Write(Pop:5, ' ');
{In ra phn t nh ngn xp}
if count mod 16 = 0 then WriteLn; {Output khng qu 16 s trn mt dng}
end;
end;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.

Bi tp:
Trn mt phng cho n hnh ch nht c cc cnh song song vi cc trc to . Hy ch ra mt chu
trnh:
Ch i trn cnh ca cc hnh ch nht
Trn cnh ca mi hnh ch nht, ngoi tr nhng giao im vi cnh ca hnh ch nht khc
c th qua nhiu ln, nhng im cn li ch c qua ng mt ln.
C

M D A B C M F G N L I J K N H E M

L Minh Hong

L thuyt th

\ 53 [

7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON


I. NH NGHA
Cho th G = (V, E) c n nh
1. Chu trnh (x1, x2, ..., xn, x1) c gi l chu trnh Hamilton nu xi xj vi 1 i < j n
2. ng i (x1, x2, ..., xn) c gi l ng i Hamilton nu xi xj vi 1 i < j n
C th pht biu mt cch hnh thc: Chu trnh Hamilton l chu trnh xut pht t 1 nh, i thm
tt c nhng nh cn li mi nh ng 1 ln, cui cng quay tr li nh xut pht. ng i
Hamilton l ng i qua tt c cc nh ca th, mi nh ng 1 ln. Khc vi khi nim chu
trnh Euler v ng i Euler, mt chu trnh Hamilton khng phi l ng i Hamilton bi c nh
xut pht c thm ti 2 ln.
V d: Xt 3 n th G1, G2, G3 sau:
b

G1

G2

G3

th G1 c chu trnh Hamilton (a, b, c, d, e, a). G2 khng c chu trnh Hamilton v deg(a) = 1
nhng c ng i Hamilton (a, b, c, d). G3 khng c c chu trnh Hamilton ln ng i Hamilton
II. NH L
1.

2.

3.

th v hng G, trong tn ti k nh sao cho nu xo i k nh ny cng vi nhng


cnh lin thuc ca chng th th nhn c s c nhiu hn k thnh phn lin thng. Th
khng nh l G khng c chu trnh Hamilton. Mnh phn o ca nh l ny cho ta iu
kin cn mt th c chu trnh Hamilton
nh l Dirac (1952): th v hng G c n nh (n 3). Khi nu mi nh v ca G u
c deg(v) n/2 th G c chu trnh Hamilton. y l mt iu kin mt th c chu
trnh Hamilton.
th c hng G lin thng mnh v c n nh. Nu deg+(v) n / 2 v deg-(v) n / 2 vi
mi nh v th G c chu trnh Hamilton

III. CI T
Di y ta s ci t mt chng trnh lit k tt c cc chu trnh Hamilton xut pht t nh 1, cc
chu trnh Hamilton khc c th c c bng cch hon v vng quanh. Lu rng cho ti nay,
ngi ta vn cha tm ra mt phng php no thc s hiu qu hn phng php quay lui tm
d ch mt chu trnh Hamilton cng nh ng i Hamilton trong trng hp th tng qut.
Input: file vn bn HAMILTON.INP
Dng 1 ghi s nh n ( 100) v s cnh m ca th cch nhau 1 du cch
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau 1 du cch, th hin u,
v l hai nh k nhau trong th
Output: file vn bn HAMILTON.OUT lit k cc chu trnh Hamilton

L Minh Hong

L thuyt th

\ 54 [

1
5

HAMILTON.INP
5 6
1 2
1 3
2 4
3 5
4 1
5 2

PROG07_1.PAS * Thut ton quay


program All_of_Hamilton_Circuits;
const
max = 100;
var
f: Text;
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
X: array[1..max] of Integer;
n: Integer;

HAMILTON.OUT
1 3 5 2 4 1
1 4 2 5 3 1

lui lit k chu trnh Hamilton

{Ma trn k ca th: a[u, v] = True (u, v) l cnh}


{Mng nh du Free[v] = True nu cha i qua nh v}
{Chu trnh Hamilton s tm l; 1=X[1]X[2] ... X[n] X[1]=1}

procedure Enter;
{Nhp d liu t thit b nhp chun Input}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure PrintResult; {In kt qu nu tm thy chu trnh Hamilton}
var
i: Integer;
begin
for i := 1 to n do Write(X[i], ' ');
WriteLn(X[1]);
end;
procedure Try(i: Integer); {Th cc cch chn nh th i trong hnh trnh}
var
j: Integer;
begin
for j := 1 to n do
{nh th i (X[i]) c th chn trong nhng nh}
if Free[j] and a[x[i - 1], j] then {k vi X[i - 1] v cha b i qua }
begin
x[i] := j;
{Th mt cch chn X[i]}
if i < n then
{Nu cha th chn n X[n]}
begin
Free[j] := False; {nh du nh j l i qua}
Try(i + 1);
{ cc bc th k tip khng chn phi nh j na}
Free[j] := True;
{S th phng n khc cho X[i] nn s b nh du nh va th}
end
else {Nu th chn n X[n]}
if a[j, X[1]] then PrintResult; {v nu X[n] li k vi X[1] th ta c chu trnh Hamilton}
end;
end;

L Minh Hong

L thuyt th

\ 55 [

begin
{nh hng thit b nhp/xut chun}

Assign(Input, 'HAMILTON.INP'); Reset(Input);


Assign(Output, 'HAMILTON.OUT'); Rewrite(Output);
Enter;
FillChar(Free, n, True);
{Khi to: Cc nh u cha i qua}
x[1] := 1; Free[1] := False;
{Bt u t nh 1}
Try(2);
{Th cc cch chn nh k tip}
Close(Input);
Close(Output);
end.

Bi tp:
1. Lp chng trnh nhp vo mt th v ch ra ng mt chu trnh Hamilton nu c.
2. Lp chng trnh nhp vo mt th v ch ra ng mt ng i Hamilton nu c.
3. Trong m ci ca Pc-xy v An-r-nt c 2n hip s. Mi hip s c khng qu n - 1 k
th. Hy gip Ca-xi--b, m ca An-r-nt xp 2n hip s ngi quanh mt bn trn sao cho
khng c hip s no phi ngi cnh k th ca mnh. Mi hip s s cho bit nhng k th ca
mnh khi h n sn rng.
100 000
4. Gray code: Mt hnh trn c chia thnh 2n hnh qut ng tm. Hy xp
101
001
tt c cc xu nh phn di n vo cc hnh qut, mi xu vo mt hnh
111
011
qut sao cho bt c hai xu no hai hnh qut cnh nhau u ch khc
nhau ng 1 bt. V d vi n = 3 hnh v bn
110 010
*
5. Thch : Bi ton m i tun: Trn bn c tng qut kch thc n x n
vung (n chn v 6 n 20). Trn mt no c t mt qun m. Qun m ang (X1,
Y1) c th di chuyn sang (X2, Y2) nu X1-X2.Y1-Y2 = 2 (Xem hnh v).
Hy tm mt hnh trnh ca qun m t xut pht, i qua tt c cc ca bn c, mi
ng 1 ln.
V d:
45
2
43
16
47
30
61
14

18
97
72
41
16
79
36
39
14
11

Vi n = 8;
42
3
17
44
46
1
31
48
60
37
15
64
56
13
29
62

71
42
17
96
83
40
15
12
33
38

xut pht (3, 3).


18
35
20
5
41
4
7
34
36
19
50
9
59
40
33
22
32
49
58
39
57
38
25
52
28
63
54
11
55
12
27
24

Vi n = 10;
100
43
19
70
98
95
73
84
80
93
35
82
78
75
37
34
10
59
13
32

8
21
6
51
10
23
26
53

xut pht (6, 5)


20
69
86
45
99
44
21
24
68
85
88
63
81
94
67
90
74
89
64
49
1
76
91
66
92
65
2
61
77
60
57
52
56
31
8
5
9
58
55
30

22
87
26
47
62
51
28
3
54
7

25
46
23
50
27
48
53
6
29
4

Gi : Nu coi cc ca bn c l cc nh ca th v cc cnh l ni gia hai nh tng ng


vi hai m giao chn th d thy rng hnh trnh ca qun m cn tm s l mt ng i
Hamilton. Ta c th xy dng hnh trnh bng thut ton quay lui kt hp vi phng php duyt
u tin Warnsdorff: Nu gi deg(x, y) l s k vi (x, y) v cha i qua (k y theo ngha
L Minh Hong

L thuyt th

\ 56 [

nh k ch khng phi l k cnh) th t mt ta s khng th xt ln lt cc hng i c


th, m ta s u tin th hng i ti c deg nh nht trc. Trong trng hp c tn ti
ng i, phng php ny hot ng vi tc tuyt vi: Vi mi n chn trong khong t 6 ti
18, vi mi v tr xut pht, trung bnh thi gian tnh t lc bt u ti lc tm ra mt nghim < 1
giy. Tuy nhin trong trng hp n l, c lc khng tn ti ng i, do phi duyt ht mi kh
nng nn thi gian thc thi li ht sc ti t. (C xt u tin nh trn hay xt th t nh trc kia
th cng vy thi. Khng tin c th vi n l: 5, 7, 9 ... v xut pht (1, 2), sau ngi xem my
tnh tot m hi).

L Minh Hong

L thuyt th

\ 57 [

8. BI TON NG I NGN NHT


I. TH C TRNG S
th m mi cnh ca n c gn cho tng ng vi mt s (nguyn hoc thc) c gi l
th c trng s. S gn cho mi cnh ca th c gi l trng s ca cnh. Tng t nh th
khng trng s, c nhiu cch biu din th c trng s trong my tnh. i vi n th th
cch d dng nht l s dng ma trn trng s:
Gi s th G = (V, E) c n nh. Ta s dng ma trn vung C kch thc n x n. y:
Nu (u, v) E th C[u, v] = trng s ca cnh (u, v)
Nu (u, v) E th tu theo trng hp c th, C[u, v] c gn mt gi tr no c th
nhn bit c (u, v) khng phi l cnh (Chng hn c th gn bng +, hay bng 0, bng -
v.v...)
Quy c c[v, v] = 0 vi mi nh v.
ng i, chu trnh trong th c trng s cng c nh ngha ging nh trong trng hp
khng trng s, ch c khc l di ng i khng phi tnh bng s cnh i qua, m c tnh
bng tng trng s ca cc cnh i qua.
II. BI TON NG I NGN NHT
Trong cc ng dng thc t, chng hn trong mng li giao thng ng b, ng thu hoc
ng khng. Ngi ta khng ch quan tm n vic tm ng i gia hai a im m cn phi
la chn mt hnh trnh tit kim nht (theo tiu chun khng gian, thi gian hay chi ph). Khi
pht sinh yu cu tm ng i ngn nht gia hai nh ca th. Bi ton pht biu di dng
tng qut nh sau: Cho th c trng s G = (V, E), hy tm mt ng i ngn nht t nh xut
pht S V n nh ch F V. di ca ng i ny ta s k hiu l d[S, F] v gi l khong
cch t S n F. Nu nh khng tn ti ng i t S ti F th ta s t khong cch = +.
Nu nh th c chu trnh m (chu trnh vi di m) th khong cch gia mt s cp nh
no c th khng xc nh, bi v bng cch i vng theo chu trnh ny mt s ln ln, ta
c th ch ra ng i gia hai nh no trong chu trnh ny nh hn bt k mt s cho trc
no. Trong trng hp nh vy, c th t vn tm ng i c bn (ng i khng c
nh lp li) ngn nht. Vn l mt vn ht sc phc tp m ta s khng bn ti y.
Nu nh th khng c chu trnh m th ta c th chng minh c rng mt trong nhng
ng i ngn nht l ng i c bn. V nu nh bit c khong cch t S ti tt c nhng
nh khc th ng i ngn nht t S ti F c th tm c mt cch d dng qua thut ton
sau:
Gi c[u, v] l trng s ca cnh [u, v]. Qui c c[v, v] = 0 vi mi v V v c[u, v] = + nu nh
(u, v) E. t d[S, v] l khong cch t S ti v. tm ng i t S ti F, ta c th nhn thy
rng lun tn ti nh F1 F sao cho:
d[S, F] = d[S, F1] + c[F1, F]
( di ng i ngn nht S->F = di ng i ngn nht S->F1 + Chi ph i t F1 ti F)
nh F1 l nh lin trc F trong ng i ngn nht t S ti F. Nu F1S th ng i ngn
nht l ng i trc tip theo cung (S, F). Nu khng th vn tr thnh tm ng i ngn nht
t S ti F1. V ta li tm c mt nh F2 khc F v F1 :
d[S, F1] = d[S, F2] + c[F2, F1]
L Minh Hong

L thuyt th

\ 58 [

C tip tc nh vy, sau mt s hu hn bc, ta suy ra rng dy F, F1, F2, ... khng cha nh lp
li v kt thc S. Lt ngc th t dy cho ta ng i ngn nht t S ti F.
...

F1

F2

Tuy nhin, trong a s trng hp, ngi ta khng s dng phng php ny m s kt hp lu vt
ng i ngay trong qu trnh tm kim.
Di y ta s xt mt s thut ton tm ng i ngn nht t nh S ti nh F trn n th c
hng G = (V, E) c n nh v m cung. Trong trng hp n th v hng vi trng s khng
m, bi ton tm ng i ngn nht c th dn v bi ton trn th c hng bng cch thay mi
cnh ca n bng hai cung c hng ngc chiu nhau. Lu rng cc thut ton di y s lun
lun tm c ng i ngn nht l ng i c bn.
Input: file vn bn MINPATH.INP
Dng 1: Cha s nh n ( 100), s cung m ca th, nh xut pht S, nh ch F cch nhau
t nht 1 du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht 1 du cch, th hin (u,
v) l mt cung E v trng s ca cung l c[u,v] (c[u, v] l s nguyn c gi tr tuyt i
100)
Output: file vn bn MINPATH.OUT ghi ng i ngn nht t S ti F v di ng i
1

20

20
6

MINPATH.INP
6 7 1 4
1 2 1
1 6 20
2 3 2
3 4 20
3 6 3
5 4 5
6 5 4

MINPATH.OUT
Distance from 1 to 4: 15
4<-5<-6<-3<-2<-1

III. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD


BELLMAN
Thut ton Ford-Bellman c th pht biu rt n gin:
Vi nh xut pht S. Gi d[v] l khong cch t S ti v.
Ban u d[v] c khi gn bng c[S, v]
Sau ta ti u ho dn cc d[v] nh sau: Xt mi cp nh u, v ca th, nu c mt cp nh
u, v m d[v] > d[u]+ c[u, v] th ta t li d[v] := d[u] + c[u, v]. Tc l nu di ng i t S ti
v li ln hn tng di ng i t S ti u cng vi chi ph i t u ti v th ta s hu b ng i
t S ti v ang c v coi ng i t S ti v chnh l ng i t S ti u sau i tip t u ti v.
Ch rng ta t c[u, v] = + nu (u, v) khng l cung. Thut ton s kt thc khi khng th ti u
thm bt k mt nhn d[v] no na.
Tnh dng ca thut ton:
Ti bc lp 1: Bc khi to d[v] = c[S, v]: th dy d[v] chnh l di ngn nht ca ng
i t S ti v qua khng qu 1 cnh.
Gi s ti bc lp th i (i 1), d[v] bng di ng i ngn nht t S ti v qua khng qu i
cnh, th do tnh cht: ng i t S ti v qua khng qu i + 1 cnh s phi thnh lp bng cch:
L Minh Hong

L thuyt th

\ 59 [

ly mt ng i t S ti mt nh u no qua khng qu i cnh, ri i tip ti v bng cung (u,


v). Nn di ng i ngn nht t S ti v qua khng qu i + 1 cnh s c tnh bng gi tr
nh nht trong cc gi tr: (Nguyn l ti u Bellman)
di ng i ngn nht t S ti v qua khng qu i cnh
di ng i ngn nht t S ti u qua khng qu i cnh cng vi trng s cnh (u, v)
(u)
V vy, sau bc lp ti u cc d[v] bng cng thc
d[v]bc i+1 = min(d[v]bc i, d[u]bc i+ c[u, v]) (u)
th cc d[v] s bng di ng i ngn nht t S ti v qua khng qu i + 1 cnh.
Sau bc lp ti u th n - 2, ta c d[v] = di ng i ngn nht t S ti v qua khng qu n - 1
cnh. V th khng c chu trnh m nn s c mt ng i ngn nht t S ti v l ng i c
bn (qua khng qu n - 1 cnh). Tc l d[v] s l di ng i ngn nht t S ti v.
Vy th s bc lp ti u ho s khng qu n - 2 bc.
Trong khi ci t chng trnh, nu mi bc ta m t di dng:
for u := 1 to n do
for v := 1 to n do
d[v] := min(d[v], d[u] + c[u, v]);

Th do s ti u bc cu (dng d[u] ti u d[v] ri li c th dng d[v] ti u d[w] na...) nn ch


lm tc ti u nhn d[v] tng nhanh ln ch khng th gim i c.
PROG08_1.PAS * Thut ton Ford-Bellman
program Shortest_Path_by_Ford_Bellman;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
n, S, F: Integer;
procedure LoadGraph;
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);

{Nhp th t thit b nhp chun (Input), th khng c c chu trnh m}

{Nhng cnh khng c trong th c gn trng s +}

for u := 1
for v :=
if u =
for i := 1
end;

to n do
1 to n do
v then c[u, v] := 0 else c[u, v] := maxC;
to m do ReadLn(u, v, c[u, v]);

procedure Init;
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
end;
procedure Ford_Bellman;

L Minh Hong

{Khi to}

{ di ng i ngn nht t S ti i = c(S, i)}

{Thut ton Ford-Bellman}

L thuyt th

\ 60 [

var
Stop: Boolean;
u, v, CountLoop: Integer;
begin
CountLoop := 0;
{Bin m s ln lp}
repeat
Stop := True;
for u := 1 to n do
for v := 1 to n do
if d[v] > d[u] + c[u, v] then
{Nu u, v tho mn d[v] > d[u] + c[u, v] th ti u li d[v]}
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
{Lu vt ng i}
Stop := False;
end;
Inc(CountLoop);
until Stop or (CountLoop >= n - 2);
{Thut ton kt thc khi khng sa nhn cc d[v] c na hoc lp n-2 ln }

end;
procedure PrintResult; {In ng i t S ti F}
begin
if d[F] = maxC then
{Nu d[F] vn l + th tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt tm ng i}
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
Close(Input);
Close(Output);
end.

IV. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON


DIJKSTRA
Trong trng hp trng s trn cc cung khng m, thut ton do Dijkstra xut di y hot
ng hiu qu hn nhiu so vi thut ton Ford-Bellman. Ta hy xem trong trng hp ny, thut
ton Ford-Bellman thiu hiu qu ch no:
Vi nh v V, Gi d[v] l di ng i ngn nht t S ti v. Thut ton Ford-Bellman khi to
d[v] = c[S, v]. Sau ti u ho dn cc nhn d[v] bng cch sa nhn theo cng thc: d[v] :=
min(d[v], d[u] + c[u, v]) vi u, v V. Nh vy nu nh ta dng nh u sa nhn nh v, sau
nu ta li ti u c d[u] thm na th ta cng phi sa li nhn d[v] dn ti vic d[v] c th phi
chnh i chnh li rt nhiu ln. Vy nn chng, ti mi bc khng phi ta xt mi cp nh (u,

L Minh Hong

L thuyt th

\ 61 [

v) dng nh u sa nhn nh v m s chn nh u l nh m khng th ti u nhn d[u]


thm c na.
Thut ton Dijkstra (E.Dijkstra - 1959) c th m t nh sau:
Bc 1: Khi to
Vi nh v V, gi nhn d[v] l di ng i ngn nht t S ti v. Ta s tnh cc d[v]. Ban u
d[v] c khi gn bng c[S, v]. Nhn ca mi nh c hai trng thi t do hay c nh, nhn t do
c ngha l c th cn ti u hn c na v nhn c nh tc l d[v] bng di ng i
ngn nht t S ti v nn khng th ti u thm. lm iu ny ta c th s dng k thut nh
du: Free[v] = TRUE hay FALSE tu theo d[v] t do hay c nh. Ban u cc nhn u t do.
Bc 2: Lp
Bc lp gm c hai thao tc:
1. C nh nhn: Chn trong cc nh c nhn t do, ly ra nh u l nh c d[u] nh
nht, v c nh nhn nh u.
2. Sa nhn: Dng nh u, xt tt c nhng nh v v sa li cc d[v] theo cng thc:
d[v] := min(d[v], d[u] + c[u, v])
Bc lp s kt thc khi m nh ch F c c nh nhn (tm c ng i ngn nht t
S ti F); hoc ti thao tc c nh nhn, tt c cc nh t do u c nhn l + (khng tn ti
ng i).
C th t cu hi, thao tc 1, ti sao nh u nh vy c c nh nhn, gi s d[u] cn c th ti
u thm c na th tt phi c mt nh t mang nhn t do sao cho d[u] > d[t] + c[t, u]. Do trng
s c[t, u] khng m nn d[u] > d[t], tri vi cch chn d[u] l nh nht. Tt nhin trong ln lp u
tin th S l nh c c nh nhn do d[S] = 0.
Bc 3: Kt hp vi vic lu vt ng i trn tng bc sa nhn, thng bo ng i ngn nht
tm c hoc cho bit khng tn ti ng i (d[F] = +).
PROG08_2.PAS * Thut ton Dijkstra
program Shortest_Path_by_Dijkstra;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean;
n, S, F: Integer;
procedure LoadGraph;
{Nhp th, trng s cc cung phi l s khng m}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;
procedure Init;
var
i: Integer;
begin
L Minh Hong

{Khi to cc nhn d[v], cc nh u c coi l t do}

L thuyt th

\ 62 [

for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
FillChar(Free, SizeOf(Free), True);
end;
procedure Dijkstra;
var
i, u, v: Integer;
min: Integer;
begin
repeat

{Thut ton Dijkstra}

{Tm trong cc nh c nhn t do ra nh u c d[u] nh nht}

u := 0; min := maxC;
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
{Thut ton s kt thc khi cc nh t do u c nhn + hoc chn n nh F}

if (u = 0) or (u = F) then Break;
{C nh nhn nh u}

Free[u] := False;
{Dng nh u ti u nhn nhng nh t do k vi u}

for v := 1 to n do
if Free[v] and (d[v] > d[u] + c[u, v]) then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end;
until False;
end;
procedure PrintResult;
{In ng i t S ti F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Dijkstra;
PrintResult;
Close(Input);
Close(Output);
end.

L Minh Hong

L thuyt th

\ 63 [

V. THUT TON DIJKSTRA V CU TRC HEAP


Nu th c nhiu nh, t cnh, ta c th s dng danh sch k km trng s biu din th,
tuy nhin tc ca thut ton DIJKSTRA vn kh chm v trong trng hp xu nht, n cn n
ln c nh nhn v mi ln tm nh c nh nhn s mt mt on chng trnh vi phc tp
O(n). tng tc , ngi ta thng s dng cu trc d liu Heap lu cc nh cha c nh
nhn. Heap y l mt cy nh phn hon chnh tho mn: Nu u l nh lu nt cha v v l
nh lu nt con th d[u] d[v]. (nh r lu gc Heap l nh c d[r] nh nht).
Ti mi bc lp ca thut ton Dijkstra c hai thao tc: Tm nh c nh nhn v Sa nhn.
Thao tc tm nh c nh nhn s ly nh lu gc Heap, c nh nhn, a phn t cui
Heap vo th ch v thc hin vic vun ng (Adjust)
Thao tc sa nhn, s duyt danh sch k ca nh va c nh nhn v sa nhn nhng nh t
do k vi nh ny, mi ln sa nhn mt nh no , ta xc nh nh ny nm u trong
Heap v thc hin vic chuyn nh ln (UpHeap) pha gc Heap nu cn bo ton cu
trc Heap.
Ci t di y c Input/Output ging nh trn nhng c th thc hin trn th 5000 nh,
10000 cnh, trng s mi cnh 10000.
PROG08_3.PAS * Thut ton Dijkstra v cu trc Heap
program Shortest_Path_by_Dijkstra_and_Heap;
const
max = 5000;
maxE = 10000;
maxC = 1000000000;
type
TAdj = array[1..maxE] of Integer;
TAdjCost = array[1..maxE] of LongInt;
THeader = array[1..max + 1] of Integer;
var
adj: ^TAdj;
{Danh sch k dng Forward Star}
adjCost: ^TAdjCost;
{Km trng s}
head: ^THeader;
{Mng nh du cc on ca Forward Star}
d: array[1..max] of LongInt;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean;
heap, Pos: array[1..max] of Integer;
n, S, F, nHeap: Integer;
procedure LoadGraph; {Nhp d liu}
var
i, m: Integer;
u, v, c: Integer;
inp: Text;
begin
{c file ln 1, xc nh cc on}

Assign(inp, 'MINPATH.INP'); Reset(inp);


ReadLn(inp, n, m, S, F);
New(head);
New(adj); New(adjCost);
{Php m phn phi (Distribution Counting)}

FillChar(head^, SizeOf(head^), 0);


for i := 1 to m do
begin
ReadLn(inp, u);
Inc(head^[u]);
end;
for i := 2 to n do head^[i] := head^[i - 1] + head^[i];
L Minh Hong

L thuyt th

\ 64 [

Close(inp);
{n y, ta xc nh c head[u] l v tr cui ca danh sch k nh u trong adj^}
Reset(inp);
{c file ln 2, vo cu trc Forward Start}
ReadLn(inp);
{B qua dng u tin Input file}

for i := 1 to m do
begin
ReadLn(inp, u, v, c);
adj^[head^[u]] := v;
adjCost^[head^[u]] := c;
Dec(head^[u]);
end;
head^[n + 1] := m;
Close(inp);
end;

{in v v c vo v tr ng trong danh sch k ca u}

procedure Init;
{Khi to d[i] = di ng i ngn nht t S ti i qua 0 cnh, Heap rng}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[S] := 0;
FillChar(Free, SizeOf(Free), True);
FillChar(Pos, SizeOf(Pos), 0);
nHeap := 0;
end;
procedure Update(v: Integer);
{nh v va c sa nhn, cn phi chnh li Heap}
var
parent, child: Integer;
begin
child := Pos[v];
{child l v tr ca v trong Heap}
if child = 0 then {Nu v cha c trong Heap th Heap phi b sung thm 1 phn t v coi child = nt l cui Heap}
begin
Inc(nHeap); child := nHeap;
end;
parent := child div 2; {parent l nt cha ca child}
while (parent > 0) and (d[heap[parent]] > d[v]) do
begin
{Nu nh lu nt parent u tin km hn v th nh s b y xung nt con child}
heap[child] := heap[parent]; {y nh lu trong nt cha xung nt con}
Pos[heap[child]] := child;
{Ghi nhn li v tr mi ca nh }
child := parent;
{Tip tc xt ln pha nt gc}
parent := child div 2;
end;
{Thao tc "ko xung" trn to ra mt "khong trng" ti nt child ca Heap, nh v s c t vo y}

heap[child] := v;
Pos[v] := child;
end;
function Pop: Integer;
var
r, c, v: Integer;
begin
Pop := heap[1];
{Nt gc Heap cha nh c nhn t do nh nht}
v := heap[nHeap]; {v l nh nt l cui Heap, s c o ln u v vun ng}
Dec(nHeap);
r := 1;
{Bt u t nt gc}
while r * 2 <= nHeap do {Chng no r cha phi l l}
begin
{Chn c l nt cha nh u tin hn trong hai nt con}

c := r * 2;
if (c < nHeap) and (d[heap[c + 1]] < d[heap[c]]) then Inc(c);
{Nu v u tin hn c nh cha trong C, th thot ngay}

if d[v] <= d[heap[c]] then Break;


heap[r] := heap[c]; {Chuyn nh lu nt con c ln nt cha r}
L Minh Hong

L thuyt th

\ 65 [

Pos[heap[r]] := r; {Ghi nhn li v tr mi trong Heap ca nh }


r := c;
{Gn nt cha := nt con v lp li}
end;
heap[r] := v; {nh v s c t vo nt r bo ton cu trc Heap}
Pos[v] := r;
end;
procedure Dijkstra;
var
i, u, iv, v: Integer;
min: Integer;
begin
Update(1);
repeat
u := Pop;
{Chn nh t do c nhn nh nht}
if u = F then Break; {Nu nh l F th dng ngay}
Free[u] := False;
{C nh nhn nh }
for iv := head^[u] + 1 to head^[u + 1] do {Xt danh sch k}
begin
v := adj^[iv];
if Free[v] and (d[v] > d[u] + adjCost^[iv]) then
begin
d[v] := d[u] + adjCost^[iv];
{Ti u ho nhn ca cc nh t do k vi u}
Trace[v] := u;
{Lu vt ng i}
Update(v);
{T chc li Heap}
end;
end;
until nHeap = 0;
{Khng cn nh no mang nhn t do}
end;
procedure PrintResult;
var
out: Text;
begin
Assign(out, 'MINPATH.OUT'); Rewrite(out);
if d[F] = maxC then
WriteLn(out, 'Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn(out, 'Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(out, F, '<-');
F := Trace[F];
end;
WriteLn(out, S);
end;
Close(out);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
end.

VI. TRNG HP TH KHNG C CHU TRNH - TH T T P


Ta c nh l sau: Gi s G = (V, E) l th khng c chu trnh (c hng - tt nhin). Khi cc
nh ca n c th nh s sao cho mi cung ca n ch ni t nh c ch s nh hn n nh c
ch s ln hn.

L Minh Hong

L thuyt th

\ 66 [

2
4

2
5

4
5
6

6
3

Hnh 19: Php nh li ch s theo th t tp

Thut ton nh s li cc nh ca th c th m t nh sau:


Trc ht ta chn mt nh khng c cung i vo v nh ch s 1 cho nh . Sau xo b nh
ny cng vi tt c nhng cung t u i ra, ta c mt th mi cng khng c chu trnh, v li
nh ch s 2 cho mt nh v no khng c cung i vo, ri li xo nh v cng vi cc cung t v
i ra ... Thut ton s kt thc nu nh hoc ta nh ch s c ht cc nh, hoc tt c cc
nh cn li u c cung i vo. Trong trng hp tt c cc nh cn li u c cung i vo th s
tn ti chu trnh trong th v khng nh thut ton tm ng i ngn nht trong mc ny khng
p dng c. (Thut ton nh s ny c th ci tin bng cch dng mt hng i v cho nhng
nh khng c cung i vo ng ch ln lt trong hng i , ln lt rt cc nh khi hng i
v nh s cho n, ng thi hu nhng cung i ra khi nh va nh s, lu sau mi ln loi b
cung (u, v), nu thy bn bc vo ca v = 0 th y v vo ch trong hng i, nh vy mt cng
duyt tm nhng nh c bn bc vo = 0)
Nu cc nh c nh s sao cho mi cung phi ni t mt nh ti mt nh khc mang ch s
ln hn th thut ton tm ng i ngn nht c th m t rt n gin:
Gi d[v] l di ng i ngn nht t S ti v. Khi to d[v] = c[S, v]. Ta s tnh cc d[v] nh
sau:
for u := 1 to n - 1 do
for v := u + 1 to n do
d[v] := min(d[v], d[u] + c[u, v]);

(Gi thit rng c[u, v] = + nu nh (u, v) khng l cung).


Tc l dng nh u, ti u nhn d[v] ca nhng nh v ni t u, vi u c xt ln lt t 1 ti n 1. C th lm tt hn na bng cch ch cn cho u chy t nh xut pht S ti nh kt thc F. Bi
h u chy ti u th nhn d[u] l khng th cc tiu ho thm na.
PROG08_4.PAS * ng i ngn nht trn th khng c chu trnh
program Critical_Path;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
List, d, Trace: array[1..max] of Integer; {List l danh sch cc nh theo cch nh s mi}
n, S, F, count: Integer;
procedure LoadGraph; {Nhp d liu, th khng c c chu trnh}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;
L Minh Hong

L thuyt th

\ 67 [

procedure Number;
{Thut ton nh s cc nh}
var
deg: array[1..max] of Integer;
u, v: Integer;
front: Integer;
begin
-

{Trc ht, tnh bn bc vo ca cc nh (deg )}

FillChar(deg, SizeOf(deg), 0);


for u := 1 to n do
for v := 1 to n do
if (v <> u) and (c[v, u] < maxC) then Inc(deg[u]);
{a nhng nh c bn bc vo = 0 vo danh sch List}

count := 0;
for u := 1 to n do
if deg[u] = 0 then
begin
Inc(count); List[count] := u;
end;
{front: Ch s phn t ang xt, count: S phn t trong danh sch}

front := 1;
while front <= count do
begin

{Chng no cha xt ht cc phn t trong danh sch}

{Xt phn t th front trong danh sch, y con tr front sang phn t k tip}

u := List[front]; Inc(front);
for v := 1 to n do
if c[u, v] <> maxC then {Xt nhng cung (u, v) v "loi" khi th deg-(v) gim 1}
begin
Dec(deg[v]);
if deg[v] = 0 then
{Nu v tr thnh nh khng c cung i vo}
begin
{a tip v vo danh sch List}
Inc(count);
List[count] := v;
end;
end;
end;
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
end;
procedure FindPath;
{Thut ton quy hoch ng tm ng i ngn nht trn th khng chu trnh}
var
i, j, u, v: Integer;
begin
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
u := List[i]; v := List[j];
{Dng List[i] ti u nhn List[j] vi i < j}
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end
end;
end;
L Minh Hong

L thuyt th

\ 68 [

procedure PrintResult;
{In ng i t S ti F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Number;
if Count < n then
WriteLn('Error: Circuit Exist')
else
begin
Init;
FindPath;
PrintResult;
end;
Close(Input);
Close(Output);
end.

VII. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD


Cho n th c hng, c trng s G = (V, E) vi n nh v m cnh. Bi ton t ra l hy tnh
tt c cc d(u, v) l khong cch t u ti v. R rng l ta c th p dng thut ton tm ng i
ngn nht xut pht t mt nh vi n kh nng chn nh xut pht. Nhng ta c cch lm gn hn
nhiu, cch lm ny rt ging vi thut ton Warshall m ta bit: T ma trn trng s c, thut
ton Floyd tnh li cc c[u, v] thnh di ng i ngn nht t u ti v:
Vi mi nh k ca th c xt theo th t t 1 ti n, xt mi cp nh u, v. Cc tiu ho c[u, v]
theo cng thc:
c[u, v] := min(c[u, v], c[u, k] + c[k, v])
Tc l nu nh ng i t u ti v ang c li di hn ng i t u ti k cng vi ng i t k
ti v th ta hu b ng i t u ti v hin thi v coi ng i t u ti v s l ni ca hai ng i
t u ti k ri t k ti v (Ch rng ta cn c vic lu li vt):
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
c[u, v] := min(c[u, v], c[u, k] + c[k, v]);

Tnh ng ca thut ton:


Gi ck[u, v] l di ng i ngn nht t u ti v m ch i qua cc nh trung gian thuc tp {1,
2, ..., k}. R rng khi k = 0 th c0[u, v] = c[u, v] (ng i ngn nht l ng i trc tip).
Gi s ta tnh c cc ck-1[u, v] th ck[u, v] s c xy dng nh sau:
Nu ng i ngn nht t u ti v m ch qua cc nh trung gian thuc tp {1, 2, ..., k} li:
Khng i qua nh k th tc l ch qua cc nh trung gian thuc tp {1, 2, ..., k - 1} th
L Minh Hong

L thuyt th

\ 69 [

ck[u, v] = ck-1[u, v]
C i qua nh k th ng i s l ni ca mt ng i t u ti k v mt ng i t k ti
v, hai ng i ny ch i qua cc nh trung gian thuc tp {1, 2, ..., k - 1}.
ck[u, v] = ck-1[u, k] + ck-1[k, v].
V ta mun ck[u, v] l cc tiu nn suy ra: ck[u, v] = min(ck-1[u, v], ck-1[u, k] + ck-1[k, v]).
V cui cng, ta quan tm ti cn[u, v]: di ng i ngn nht t u ti v m ch i qua cc nh
trung gian thuc tp {1, 2, ..., n}.
Khi ci t, th ta s khng c cc khi nim ck[u, v] m s thao tc trc tip trn cc trng s c[u,
v]. c[u, v] ti bc ti u th k s c tnh ton ti u qua cc gi tr c[u, v]; c[u, k] v c[k, v]
ti bc th k - 1. V nu ci t di dng ba vng lp for lng nh trn, do c s ti u bc cu
ti mi bc, tc ti u c[u, v] ch tng ln ch khng th gim i c.
PROG08_5.PAS * Thut ton Floyd
program Shortest_Path_by_Floyd;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
Trace: array[1..max, 1..max] of Integer; {Trace[u, v] = nh lin sau u trn ng i t u ti v}
n, S, F: Integer;
procedure LoadGraph;
{Nhp d liu, th khng c c chu trnh m}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;
procedure Floyd;
var
k, u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do Trace[u, v] := v; {Gi s ng i ngn nht gia mi cp nh l ng trc tip}
{Thut ton Floyd}

for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
if c[u, v] > c[u, k] + c[k, v] then
begin
c[u, v] := c[u, k] + c[k, v];
Trace[u, v] := Trace[u, k];
end;
end;

{ng i t qua k tt hn}


{Ghi nhn ng i thay cho ng c}
{Lu vt ng i}

procedure PrintResult; {In ng i t S ti F}


begin
if c[S, F] = maxC
then WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', c[S, F]);
repeat
L Minh Hong

L thuyt th
Write(S, '->');
S := Trace[S, F];
until S = F;
WriteLn(F);
end;

\ 70 [
{Nhc li rng Trace[S, F] l nh lin sau S trn ng i ti F}

end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Floyd;
PrintResult;
Close(Input);
Close(Output);
end.

Khc bit r rng ca thut ton Floyd l khi cn tm ng i ngn nht gia mt cp nh khc,
chng trnh ch vic in kt qu ch khng phi thc hin li thut ton Floyd na.
VIII. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i du
trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra trng hp
c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh hay
danh sch k c trng s, nn ta u a v th y v em trng s + gn cho nhng
cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng + nn ta
s phi chn mt s dng ln thay. Nh th no l ln? s phi ln hn tt c
trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt hn ng i
trc tip theo cnh tng tng ra . Vy nn nu th cho s nh cng nh trng s cc cnh
vo c 300 chng hn th gi tr khng th chn trong phm vi Integer hay Word. Ma trn c
s phi khai bo l ma trn LongInt v gi tr hng s maxC trong cc chng trnh trn phi i
li l 300 * 299 + 1 - iu c th gy ra nhiu phin toi, chng hn nh vn lng ph b nh.
khc phc, ngi ta c th ci t bng danh sch k km trng s hoc s dng nhng k thut
nh du kho lo trong tng trng hp c th. Tuy nhin c mt iu chc chn: khi th cho s
nh cng nh trng s cc cnh vo khong 300 th cc trng s c[u, v] trong thut ton Floyd
v cc nhn d[v] trong ba thut ton cn li chc chn khng th khai bo l Integer c.
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l O(n3),
thut ton Dijkstra l O(n2), thut ton ti u nhn theo th t tp l O(n2) cn thut ton Floyd l
O(n3). Tuy nhin nu s dng danh sch k, thut ton ti u nhn theo th t tp s c phc
tp tnh ton l O(m). Thut ton Dijkstra kt hp vi cu trc d liu Heap c phc tp
O(max(n, m).logn).
Khc vi mt bi ton i s hay hnh hc c nhiu cch gii th ch cn nm vng mt cch cng
c th coi l t yu cu, nhng thut ton tm ng i ngn nht bc l rt r u, nhc im
trong tng trng hp c th (V d nh s nh ca th qu ln lm cho khng th biu din
bng ma trn trng s th thut ton Floyd s gp kh khn, hay thut ton Ford-Bellman lm vic
kh chm). V vy yu cu trc tin l phi hiu bn cht v thnh tho trong vic ci t tt c cc
thut ton trn c th s dng chng mt cch uyn chuyn trong tng trng hp c th. Nhng
bi tp sau y cho ta thy r iu .
Bi tp
L Minh Hong

L thuyt th

\ 71 [

1. Gii thch ti sao i vi th sau, cn tm ng i di nht t nh 1 ti nh 4 li khng th


dng thut ton Dijkstra c, c th p dng thut ton Dijkstra theo tng bc xem sao:
2

2
1

3
2

2. Trn mt phng cho n ng trn (n 2000), ng trn th i c cho bi b ba s thc (Xi,


Yi, Ri), (Xi, Yi) l to tm v Ri l bn knh. Chi ph di chuyn trn mi ng trn bng 0. Chi
ph di chuyn gia hai ng trn bng khong cch gia chng. Hy tm phng n di chuyn
gia hai ng trn S, F cho trc vi chi ph t nht.
3. Cho mt dy n s nguyn A[1], A[2], ..., A[n] (n 10000; 1 A[i] 10000). Hy tm mt dy
con gm nhiu nht cc phn t ca dy cho m tng ca hai phn t lin tip l s nguyn t.
4. Mt cng trnh ln c chia lm n cng on nh s 1, 2, ..., n. Cng on i phi thc hin mt
thi gian t[i]. Quan h gia cc cng on c cho bi bng a[i, j]: a[i, j] = TRUE cng on j
ch c bt u khi m cng vic i xong. Hai cng on c lp nhau c th tin hnh song
song, hy b tr lch thc hin cc cng on sao cho thi gian hon thnh c cng trnh l sm
nht, cho bit thi gian sm nht .
5. Cho mt bng cc s t nhin kch thc mxn (1 m, n 100). T mt c th di chuyn sang
mt k cnh vi n. Hy tm mt cch i t (x, y) ra mt bin sao cho tng cc s ghi trn cc
i qua l cc tiu.

L Minh Hong

L thuyt th

\ 72 [

9. BI TON CY KHUNG NH NHT


I. BI TON CY KHUNG NH NHT
Cho G = (V, E) l th v hng lin thng c trng s, vi mt cy khung T ca G, ta gi trng
s ca cy T l tng trng s cc cnh trong T. Bi ton t ra l trong s cc cy khung ca G, ch
ra cy khung c trng s nh nht, cy khung nh vy c gi l cy khung nh nht ca th,
v bi ton gi l bi ton cy khung nh nht. Sau y ta s xt hai thut ton thng dng
gii bi ton cy khung nh nht ca n th v hng c trng s.
Input: file vn bn MINTREE.INP:

Dng 1: Ghi hai s s nh n ( 100) v s cnh m ca th cch nhau t nht 1 du cch

m dng tip theo, mi dng c dng 3 s u, v, c[u, v] cch nhau t nht 1 du cch th hin
th c cnh (u, v) v trng s cnh l c[u, v]. (c[u, v] l s nguyn c gi tr tuyt i khng
qu 100).
Output: file vn bn MINTREE.OUT ghi cc cnh thuc cy khung v trng s cy khung
6

2
1

1
5
1

2
1

MINTREE.INP
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2

MINTREE.OUT
Minimal spanning tree:
(2, 4) = 1
(3, 6) = 1
(2, 5) = 1
(1, 3) = 1
(1, 2) = 1
Weight = 5

II. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956)


Thut ton Kruskal da trn m hnh xy dng cy khung bng thut ton hp nht (5), ch c
iu thut ton khng phi xt cc cnh vi th t tu m xt cc cnh theo th t sp xp: Vi
th v hng G = (V, E) c n nh. Khi to cy T ban u khng c cnh no. Xt tt c cc
cnh ca th t cnh c trng s nh n cnh c trng s ln, nu vic thm cnh vo T
khng to thnh chu trnh n trong T th kt np thm cnh vo T. C lm nh vy cho ti
khi:

Hoc kt np c n - 1 cnh vo trong T th ta c T l cy khung nh nht

Hoc cha kt np n - 1 cnh nhng h c kt np thm mt cnh bt k trong s cc cnh


cn li th s to thnh chu trnh n. Trong trng hp ny th G l khng lin thng, vic
tm kim cy khung tht bi.
Nh vy c hai vn quan trng khi ci t thut ton Kruskal:
Th nht, lm th no xt c cc cnh t cnh c trng s nh ti cnh c trng s ln. Ta c
th thc hin bng cch sp xp danh sch cnh theo th t khng gim ca trng s, sau duyt
t u ti cui danh sch cnh. Nn s dng cc thut ton sp xp hiu qu t c tc
nhanh trong trng hp s cnh ln. Trong trng hp tng qut, thut ton HeapSort l hiu qu
nht bi n cho php chn ln lt cc cnh t cnh trng nh nht ti cnh trng s ln nht ra
khi Heap v c th x l (b qua hay thm vo cy) lun.

L Minh Hong

L thuyt th

\ 73 [

Th hai, lm th no kim tra xem vic thm mt cnh c to thnh chu trnh n trong T hay
khng. rng cc cnh trong T cc bc s to thnh mt rng ( th khng c chu trnh
n). Mun thm mt cnh (u, v) vo T m khng to thnh chu trnh n th (u, v) phi ni hai cy
khc nhau ca rng T, bi nu u, v thuc cng mt cy th s to thnh chu trnh n trong cy .
Ban u, ta khi to rng T gm n cy, mi cy ch gm ng mt nh, sau , mi khi xt n
cnh ni hai cy khc nhau ca rng T th ta kt np cnh vo T, ng thi hp nht hai cy
li thnh mt cy.
Nu cho mi nh v trn cy mt nhn Lab[v] l s hiu nh cha ca nh v trong cy, trong trng
hp v l gc ca mt cy th Lab[v] c gn mt gi tr m. Khi ta hon ton c th xc nh
c gc ca cy cha nh v bng hm GetRoot nh sau:
function GetRoot(vV): V;
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;

Vy kim tra mt cnh (u, v) c ni hai cy khc nhau ca rng T hay khng? ta c th kim tra
GetRoot(u) c khc GetRoot(v) hay khng, bi mi cy ch c duy nht mt gc.
hp nht cy gc r1 v cy gc r2 thnh mt cy, ta lu rng mi cy y ch dng ghi
nhn mt tp hp nh thuc cy ch cu trc cnh trn cy th no th khng quan trng. Vy
hp nht cy gc r1 v cy gc r2, ta ch vic coi r1 l nt cha ca r2 trong cy bng cch t:
Lab[r2] := r1.
r1

r1
r2

r2
u

Hai cy gc r1 v r2 v cy mi khi hp nht chng

Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin cho
hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt, th gc cy
no t nt hn s b coi l con ca gc cy kia.
Thut ton hp nht cy gc r1 v cy gc r2 c th vit nh sau:
{Count[k] l s nh ca cy gc k}

procedure Union(r1, r2 V);


begin
if Count[r1] < Count[r2] then
{Hp nht thnh cy gc r2}
begin
Count[r2] := Count[r1] + Count[r2];
Lab[r1] := r2;
end
else
{Hp nht thnh cy gc r1}
begin
Count[r1] := Count[r1] + Count[r2];
Lab[r2] := r1;
end;
end;

L Minh Hong

L thuyt th

\ 74 [

Khi ci t, ta c th tn dng ngay nhn Lab[r] lu s nh ca cy gc r, bi nh gii thch


trn, Lab[r] ch cn mang mt gi tr m l , vy ta c th coi Lab[r] = -Count[r] vi r l gc
ca mt cy no .
procedure Union(r1, r2 V);
{Hp nht cy gc r1 vi cy gc r2}
begin
x := Lab[r1] + Lab[r2];
{-x l tng s nt ca c hai cy}
if Lab[r1] > Lab[r2] then
{Cy gc r1 t nt hn cy gc r2, hp nht thnh cy gc r2}
begin
Lab[r1] := r2; {r2 l cha ca r1}
Lab[r2] := x; {r2 l gc cy mi, -Lab[r2] gi y l s nt trong cy mi}
end
else
{Hp nht thnh cy gc r1}
begin
Lab[r1] := x; {r1 l gc cy mi, -Lab[r1] gi y l s nt trong cy mi}
Lab[r2] := r1; {cha ca r2 s l r1}
end;
end;

M hnh thut ton Kruskal:


for kV do Lab[k] := -1;
for (u, v)E (theo th t t cnh trng s nh ti cnh trng s ln) do
begin
r1 := GetRoot(u); r2 := GetRoot(v);
if r1 r2 then {(u, v) ni hai cy khc nhau}
begin
<Kt np (u, v) vo cy, nu n - 1 cnh th thut ton dng>
Union(r1, r2); {Hp nht hai cy li thnh mt cy}
end;
end;
PROG09_1.PAS * Thut ton Kruskal
program Minimal_Spanning_Tree_by_Kruskal;
const
maxV = 100;
maxE = (maxV - 1) * maxV div 2;
type
TEdge = record
{Cu trc mt cnh}
u, v, c: Integer;
{Hai nh v trng s}
Mark: Boolean;
{nh du c c kt np vo cy khung hay khng}
end;
var
e: array[1..maxE] of TEdge;
{Danh sch cnh}
Lab: array[1..maxV] of Integer;
{Lab[v] l nh cha ca v, nu v l gc th Lab[v] = - s con cy gc v}
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
var
i: Integer;
begin
ReadLn(n, m);
for i := 1 to m do
with e[i] do
ReadLn(u, v, c);
end;

{Nhp th t thit b nhp chun (Input)}

procedure Init;
var
i: Integer;
begin
for i := 1 to n do Lab[i] := -1;
{Rng ban u, mi nh l gc ca cy gm ng mt nt}
for i := 1 to m do e[i].Mark := False;
end;
L Minh Hong

L thuyt th

\ 75 [

function GetRoot(v: Integer): Integer;


begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;

{Ly gc ca cy cha v}

procedure Union(r1, r2: Integer);


var
x: Integer;
begin
x := Lab[r1] + Lab[r2];
if Lab[r1] > Lab[r2] then
begin
Lab[r1] := r2;
Lab[r2] := x;
end
else
begin
Lab[r1] := x;
Lab[r2] := r1;
end;
end;

{Hp nht hai cy li thnh mt cy}

procedure AdjustHeap(root, last: Integer);


{Vun thnh ng, dng cho HeapSort}
var
Key: TEdge;
child: Integer;
begin
Key := e[root];
while root * 2 <= Last do
begin
child := root * 2;
if (child < Last) and (e[child + 1].c < e[child].c)
then Inc(child);
if Key.c <= e[child].c then Break;
e[root] := e[child];
root := child;
end;
e[root] := Key;
end;
procedure Kruskal;
var
i, r1, r2, Count, a: Integer;
tmp: TEdge;
begin
Count := 0;
Connected := False;
for i := m div 2 downto 1 do AdjustHeap(i, m);
for i := m - 1 downto 1 do
begin
tmp := e[1]; e[1] := e[i + 1]; e[i + 1] := tmp;
AdjustHeap(1, i);
r1 := GetRoot(e[i + 1].u); r2 := GetRoot(e[i + 1].v);
if r1 <> r2 then
{Cnh e[i + 1] ni hai cy khc nhau}
begin
e[i + 1].Mark := True;
{Kt np cnh vo cy}
Inc(Count);
{m s cnh}
if Count = n - 1 then
{Nu s th thnh cng}
begin
Connected := True;
Exit;
end;
L Minh Hong

L thuyt th
Union(r1, r2);
end;

\ 76 [
{Hp nht hai cy thnh mt cy}

end;
end;
procedure PrintResult;
var
i, Count, W: Integer;
begin
if not Connected then
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
Count := 0;
W := 0;
for i := 1 to m do
{Duyt danh sch cnh}
with e[i] do
begin
if Mark then
{Lc ra nhng cnh kt np vo cy khung}
begin
WriteLn('(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break;
{Cho ti khi n - 1 cnh}
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init;
Kruskal;
PrintResult;
Close(Input);
Close(Output);
end.

Xt v phc tp tnh ton, ta c th chng minh c rng thao tc GetRoot c phc tp l


O(log2n), cn thao tc Union l O(1). Gi s ta c danh sch cnh sp xp ri th xt vng lp
dng cy khung, n duyt qua danh sch cnh v vi mi cnh n gi 2 ln thao tc GetRoot, vy
th phc tp l O(mlog2n), nu th c cy khung th m n-1 nn ta thy chi ph thi gian ch
yu s nm thao tc sp xp danh sch cnh bi phc tp ca HeapSort l O(mlog2m). Vy
phc tp tnh ton ca thut ton l O(mlog2m) trong trng hp xu nht. Tuy nhin, phi lu
rng xy dng cy khung th t khi thut ton phi duyt ton b danh sch cnh m ch mt
phn ca danh sch cnh m thi.
III. THUT TON PRIM (ROBERT PRIM - 1957)
Thut ton Kruskal hot ng chm trong trng hp th dy (c nhiu cnh). Trong trng hp
ngi ta thng s dng phng php ln cn gn nht ca Prim. Thut ton c th pht biu
hnh thc nh sau:
n th v hng G = (V, E) c n nh c cho bi ma trn trong s C. Qui c c[u, v] = +
nu (u, v) khng l cnh. Xt cy T trong G v mt nh v, gi khong cch t v ti T l trng s
nh nht trong s cc cnh ni v vi mt nh no trong T:
L Minh Hong

L thuyt th

\ 77 [

d[v] = min{c[u, v] uT}


Ban u khi to cy T ch gm c mi nh {1}. Sau c chn trong s cc nh ngoi T ra mt
nh gn T nht, kt np nh vo T ng thi kt np lun c cnh to ra khong cch gn nht
. C lm nh vy cho ti khi:

Hoc kt np c tt c n nh th ta c T l cy khung nh nht

Hoc cha kt np c ht n nh nhng mi nh ngoi T u c khong cch ti T l +.


Khi th cho khng lin thng, ta thng bo vic tm cy khung tht bi.
V mt k thut ci t, ta c th lm nh sau:
S dng mng nh du Free. Free[v] = TRUE nu nh nh v cha b kt np vo T.
Gi d[v] l khong cch t v ti T. Ban u khi to d[1] = 0 cn d[2] = d[3] = ... = d[n] = +. Ti
mi bc chn nh a vo T, ta s chn nh u no ngoi T v c d[u] nh nht. Khi kt np u
vo T ri th r rng cc nhn d[v] s thay i: d[v]mi := min(d[v]c, c[u, v]). Vn ch c vy
(chng trnh rt ging thut ton Dijkstra, ch khc cng thc ti u nhn).
PROG09_2.PAS * Thut ton Prim
program Minimal_Spanning_Tree_by_Prim;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer; {Vt, Trace[v] l nh cha ca v trong cy khung nh nht}
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
{Nhp th}
var
i, u, v: Integer;
begin
ReadLn(n, m);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC; {Khi to ma trn trng s}
for i := 1 to m do
begin
ReadLn(u, v, c[u, v]);
c[v, u] := c[u, v];
end;
end;
procedure Init;
var
v: Integer;
begin
d[1] := 0;
{nh 1 c nhn khong cch l 0}
for v := 2 to n do d[v] := maxC;
{Cc nh khc c nhn khong cch +}
FillChar(Free, SizeOf(Free), True); {Cy T ban u l rng}
end;
procedure Prim;
var
k, i, u, v, min: Integer;
begin
Connected := True;
for k := 1 to n do
begin
L Minh Hong

L thuyt th

\ 78 [

u := 0; min := maxC; {Chn nh u cha b kt np c d[u] nh nht}


for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
if u = 0 then {Nu khng chn c u no c d[u] < + th th khng lin thng}
begin
Connected := False;
Break;
end;
Free[u] := False; {Nu chn c th nh du u b kt np, lp ln 1 th d nhin u = 1 bi d[1] = 0}
for v := 1 to n do
if Free[v] and (d[v] > c[u, v]) then {Tnh li cc nhn khong cch d[v] (v cha kt np)}
begin
d[v] := c[u, v];
{Ti u nhn d[v] theo cng thc}
Trace[v] := u;
{Lu vt, nh ni vi v cho khong cch ngn nht l u}
end;
end;
end;
procedure PrintResult;
var
v, W: Integer;
begin
if not Connected then {Nu th khng lin thng th tht bi}
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
W := 0;
for v := 2 to n do {Cy khung nh nht gm nhng cnh (v, Trace[v])}
begin
WriteLn('(', Trace[v], ', ', v, ') = ', c[Trace[v], v]);
W := W + c[Trace[v], v];
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init;
Prim;
PrintResult;
Close(Input);
Close(Output);
end.

Xt v phc tp tnh ton, thut ton Prim c phc tp l O(n2). Tng t thut ton Dijkstra,
nu kt hp thut ton Prim vi cu trc Heap s c mt thut ton vi phc tp
O((m+n)logn).
Bi tp
1. Vit chng trnh to th vi s nh 100, trng s cc cnh l cc s c sinh ngu nhin.
Ghi vo file d liu MINTREE.INP ng theo khun dng quy nh. So snh kt qu lm vic ca
thut ton Kruskal v thut ton Prim v tnh ng n v v tc .
2. Trn mt nn phng vi h to Decattes vung gc t n my tnh, my tnh th i c t
to (Xi, Yi). Cho php ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt
L Minh Hong

L thuyt th

\ 79 [

dy cp mng t l thun vi khong cch gia hai my cn ni. Hy tm cch ni thm cc dy cp


mng cho cc my tnh trong ton mng l lin thng v chi ph ni mng l nh nht.
3. Tng t nh bi 2, nhng ban u c sn mt s cp my ni ri, cn cho bit cch ni thm
t chi ph nht.
4. H thng in trong thnh ph c cho bi n trm bin th v cc ng dy in ni gia cc
cp trm bin th. Mi ng dy in e c an ton l p(e). y 0 < p(e) 1. an ton ca c
li in l tch an ton trn cc ng dy. V d nh c mt ng dy nguy him: p(e) = 1%
th cho d cc ng dy khc l tuyt i an ton ( an ton = 100%) th an ton ca mng
cng rt thp (1%). Hy tm cch b i mt s dy in cho cc trm bin th vn lin thng v
an ton ca mng l ln nht c th.
5. Hy th ci t thut ton Prim vi cu trc d liu Heap cha cc nh ngoi cy, tng t nh
i vi thut ton Dijkstra.

L Minh Hong

L thuyt th

\ 80 [

10. BI TON LUNG CC I TRN MNG


Ta gi mng l mt th c hng G = (V, E), trong c duy nht mt nh A khng c cung i
vo gi l im pht, duy nht mt nh B khng c cung i ra gi l nh thu v mi cung e = (u,
v) E c gn vi mt s khng m c(e) = c[u, v] gi l kh nng thng qua ca cung .
thun tin cho vic trnh by, ta qui c rng nu khng c cung (u, v) th kh nng thng qua c[u,
v] ca n c gn bng 0.
Nu c mng G = (V, E). Ta gi lung f trong mng G l mt php gn cho mi cung e = (u, v) E
mt s thc khng m f(e) = f[u, v] gi l lung trn cung e, tho mn cc iu kin sau:
Lung trn mi cung khng vt qu kh nng thng qua ca n: 0 f[u, v] c[u, v] ( (u, v)

E)

Vi mi nh v khng trng vi nh pht A v nh thu B, tng lung trn cc cung i vo v


bng tng lung trn cc cung i ra khi v:

f [u, v] = f [v, w ] . Trong :

u ( v )

w + ( v )

-(v) = {uV(u, v) E}
+(v) = {wV(v, w) E}
Gi tr ca mt lung l tng lung trn cc cung i ra khi nh pht = tng lung trn cc cung
i vo nh thu.
2

3
6

1
0

3
5

6
3

1
3

Hnh 20: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7

I. BI TON
Cho mng G = (V, E). Hy tm lung f* trong mng vi gi tr lung ln nht. Lung nh vy gi
l lung cc i trong mng v bi ton ny gi l bi ton tm lung cc i trn mng.
II. LT CT, NG TNG LUNG, NH L FORD - FULKERSON
1. nh ngha:
Ta gi lt ct (X, Y) l mt cch phn hoch tp nh V ca mng thnh hai tp ri nhau X v Y,
trong X cha nh pht v Y cha nh thu. Kh nng thng qua ca lt ct (X, Y) l tng tt c
cc kh nng thng qua ca cc cung (u, v) c u X v v Y. Lt ct vi kh nng thng qua nh
nht gi l lt ct hp nht.
2. nh l Ford-Fulkerson:
Gi tr lung cc i trn mng ng bng kh nng thng qua ca lt ct hp nht. Vic chng
minh nh l Ford- Fulkerson xy dng c mt thut ton tm lung cc i trn mng:
Gi s f l mt lung trong mng G = (V, E). T mng G = (V, E) ta xy dng th c trng s Gf
= (V, Ef) nh sau:
Xt nhng cnh e = (u, v) E (c[u, v] > 0):

L Minh Hong

L thuyt th

\ 81 [

Nu f[u, v] < c[u, v] th ta thm cung (u, v) vo Ef vi trng s c[u, v] - f[u, v], cung gi l
cung thun. V ngha, trng s cung ny cho bit cn c th tng lung f trn cung (u, v)
mt lng khng qu trng s .

Xt tip nu nh f[u, v] > 0 th ta thm cung (v, u) vo Ef vi trng s f[u, v], cung gi l
cung nghch. V ngha, trng s cung ny cho bit cn c th gim lung f trn cung (u, v)
mt lng khng qu trng s .
th Gf c gi l th tng lung.
5
6;5

6;6

5;5
3;0

3;1

3
6

6;1

5,2
3

1;1

Hnh 21: Mng v lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng

Gi s P l mt ng i c bn t nh pht A ti nh thu B. Gi l gi tr nh nht ca cc


trng s ca cc cung trn ng i P. Ta s tng gi tr ca lung f bng cch t:

f[u, v] := f[u, v] + , nu (u, v) l cung trong ng P v l cung thun

f[v, u] := f[v, u] - , nu (u, v) l cung trong ng P v l cung nghch

Cn lung trn nhng cung khc gi nguyn


C th kim tra lung f mi xy dng vn l lung trong mng v gi tr ca lung f mi c tng
thm so vi gi tr lung f c. Ta gi thao tc bin i lung nh vy l tng lung dc ng P,
ng i c bn P t A ti B c gi l ng tng lung.
V d: vi th tng lung Gf nh trn, gi s chn ng i (1, 3, 4, 2, 5, 6). Gi tr nh nht ca
trng s trn cc cung l 2, vy th ta s tng cc gi tr f[1, 3]), f[3, 4], f[2, 5], f[5, 6] ln 2, (do cc
cung l cung thun) v gim gi tr f[2, 4] i 2 (do cung (4, 2) l cung nghch). c lung mi
mang gi tr 9.
6;5

2
5;5
3;0

6;6

5;5
3;2

3;1
6

1
6;1

5,2
3

6;3

6;6

3;3
6

1
6;3

5,4
3

1;1

5
1;1

Hnh 22: Mng G trc v sau khi tng lung

n y ta c th hnh dung ra c thut ton tm lung cc i trn mng: khi to mt lung bt


k, sau c tng lung dc theo ng tng lung, cho ti khi khng tm c ng tng
lung na
Vy cc bc ca thut ton tm lung cc i trn mng c th m t nh sau:
Bc 1: Khi to:
Mt lung bt k trn mng, chng hn nh lung 0 (lung trn cc cung u bng 0), sau :
L Minh Hong

L thuyt th

\ 82 [

Bc 2: Lp hai bc sau:

Tm ng tng lung P i vi lung hin c Tm ng i c bn t A ti B trn th


tng lung, nu khng tm c ng tng lung th bc lp kt thc.

Tng lung dc theo ng P


Bc 3: Thng bo gi tr lung cc i tm c.
III. CI T
Input: file vn bn MAXFLOW.INP. Trong :

Dng 1: Cha s nh n ( 100), s cnh m ca th, nh pht A, nh thu B theo ng th


t cch nhau t nht mt du cch

m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht mt du cch th hin
c cung (u, v) trong mng v kh nng thng qua ca cung l c[u, v] (c[u, v] l s nguyn
dng khng qu 100)
Output: file vn bn MAXFLOW.OUT ghi lung trn cc cung v gi tr lung cc i tm c
6

2
5

1
5

6
3

MAXFLOW.INP
6 8 1 6
1 2 5
1 3 5
2 4 6
2 5 3
3 4 3
3 5 1
4 6 6
5 6 6

MAXFLOW.OUT
f(1, 2) = 5
f(1, 3) = 4
f(2, 4) = 3
f(2, 5) = 2
f(3, 4) = 3
f(3, 5) = 1
f(4, 6) = 6
f(5, 6) = 3
Max Flow: 9

Ch rng ti mi bc c nhiu phng n chn ng tng lung, hai cch chn khc nhau c
th cho hai lung cc i khc nhau, tuy nhin v mt gi tr th tt c cc lung xy dng c
theo cch trn s c cng gi tr cc i.
Ci t chng trnh tm lung cc i di y rt chn phng, t ma trn nhng kh nng thng
qua c v lung f hin c (khi to f l lung 0), n xy dng th tng lung Gf bng cch xy
dng ma trn cf nh sau:
cf[u, v] = trng s cung (u, v) trn th Gf nu nh (u, v) l cung thun
cf[u, v] = - trng s cung (u, v) trn th Gf nu nh (u, v) l cung nghch
cf[u, v] = + nu nh (u, v) khng phi cung ca Gf
cf gn ging nh ma trn trng s ca Gf, ch c iu ta i du trng s nu nh gp cung nghch.
Cu hi t ra l nu nh mng cho c nhng ng hai chiu (c c cung (u, v) v cung (v, u) iu ny xy ra rt nhiu trong mng li giao thng) th th tng lung rt c th l a th
(gia u, v c th c nhiu cung t u ti v). Ma trn cf cng gp nhc im nh ma trn trng s:
khng th biu din c a th, tc l nu nh c nhiu cung ni t u ti v trong th tng
lung th ta nh chp nhn b bt m ch gi li mt cung. Rt may cho chng ta l iu
khng lm sai lch i mc ch xy dng th tng lung: ch l tm mt ng i t nh pht A
ti nh thu B m thi, cn ng no th khng quan trng.
Sau chng trnh tm ng i t nh pht A ti nh thu B trn th tng lung bng thut
ton tm kim theo chiu rng, nu tm c ng i th s tng lung dc theo ng tng
lung...

L Minh Hong

L thuyt th

\ 83 [

PROG10_1.PAS * Thut ton tm lung cc i trn mng


program Max_Flow;
const
max = 100;
maxC = 10000;
var
c, f, cf: array[1..max, 1..max] of Integer; {c: kh nng thng, f: Lung}
Trace: array[1..max] of Integer;
n, A, B: Integer;
procedure Enter;
{Nhp mng}
var
m, i, u, v: Integer;
begin
FillChar(c, SizeOf(c), 0);
ReadLn(n, m, A, B);
for i := 1 to m do
ReadLn(u, v, c[u, v]);
end;
procedure CreateGf; {Tm th tng lung, tc l xy dng cf t c v f}
var
u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do cf[u, v] := maxC;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu u, v l cung trong mng}
begin
if f[u, v] < c[u, v] then cf[u, v] := c[u, v] - f[u, v]; {t cung thun}
if f[u, v] > 0 then cf[v, u] := -f[u, v]; {t cung nghch}
end;
end;
{Th tc ny tm mt ng i t A ti B bng BFS, tr v TRUE nu c ng, FALSE nu khng c ng}

function FindPath: Boolean;


var
Queue: array[1..max] of Integer; {Hng i dng cho BFS}
Free: array[1..max] of Boolean;
u, v, First, Last: Integer;
begin
FillChar(Free, SizeOf(Free), True);
First := 1; Last := 1; Queue[1] := A; {Queue ch gm mt nh pht A}
Free[A] := False;
{nh du A}
repeat
u := Queue[First]; Inc(First);
{Ly u khi Queue}
for v := 1 to n do
if Free[v] and (cf[u, v] <> maxC) then {Xt v cha nh du k vi u}
begin
Trace[v] := u;
{Lu vt ng i A ... u v}
if v = B then
{v = B th ta c ng i t A ti B, thot th tc}
begin
FindPath := True; Exit;
end;
Free[v] := False; {nh du v}
Inc(Last);
Queue[Last] := v; {Queue v}
end;
until First > Last;
{Queue rng}
FindPath := False;
{ trn khng Exit c th tc l khng c ng}
end;

L Minh Hong

L thuyt th

\ 84 [

{Th tc tng lung dc theo ng tng lung tm c trong FindPath}

procedure IncFlow;
var
u, v, IncValue: Integer;
begin
{Trc ht d ng theo vt tm trng s nh nht ca cc cung trn ng}

IncValue := maxC;
v := B;
while v <> A do
begin
u := Trace[v]; { rng cf[u, v] l trng s ca cung (u, v) trn th tng lung}
if Abs(cf[u, v]) < IncValue then IncValue := Abs(cf[u, v]);
v:= u;
end;
{D li ng ln th hai, ln ny tng lung}

v := B;
while v <> A do
begin
u := Trace[v];
if cf[u, v] > 0 then f[u, v] := f[u, v] + IncValue {Nu (u, v) l cung thun trn Gf}
else f[v, u] := f[v, u] - IncValue; {Nu (u, v) l cung nghch trn Gf}
v := u;
end;
end;
procedure PrintResult; {In lung cc i tm c}
var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu c cung (u, v) trn mng th in ra gi tr lung f gn cho cung }
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v]; {Gi tr lung cc i = tng lung pht ra t A}
end;
WriteLn('Max Flow: ', m);
end;
begin
Assign(Input, 'MAXFLOW.INP'); Reset(Input);
Assign(Output, 'MAXFLOW.OUT'); Rewrite(Output);
Enter;
{Nhp d liu}
FillChar(f, SizeOf(f), 0); {Khi to lung 0}
repeat
{Bc lp}
CreateGf;
{Dng th tng lung}
if not FindPath then Break; {Nu khng tm c ng tng lung th thot ngay}
IncFlow;
{Tng lung dc ng tng lung}
until False;
PrintResult;
Close(Input);
Close(Output);
end.

By gi ta th xem cch lm trn c ch no v cha hay ch no ?


Trc ht, thut ton tm ng bng Breadth First Search l kh tt, ngi ta chng minh rng
nu nh ng tng lung c tm bng BFS s lm gim ng k s bc lp tng lung so vi
DFS.
Nhng c th thy rng vic xy dng tng minh c th Gf thng qua vic xy dng ma trn
cf ch lm mi mt vic tm ng l lng ph, ch cn da vo ma trn kh nng thng qua c v
lung f hin c l ta c th bit c (u, v) c phi l cung trn th tng lung Gf hay khng.
L Minh Hong

L thuyt th

\ 85 [

Th hai, ti bc tng lung, ta phi d li hai ln ng i, mt ln tm trng s nh nht ca


cc cung trn ng, mt ln tng lung. Trong khi vic tm trng s nh nht ca cc cung trn
ng c th kt hp lm ngay trong th tc tm ng bng cch sau:
t Delta[v] l trng s nh nht ca cc cung trn ng i t A ti v, khi to Delta[A] = +.
Ti mi bc t nh u thm nh v trong BFS, th Delta[v] c th c tnh bng gi tr nh
nht trong hai gi tr Delta[u] v trng s cung (u, v) trn th tng lung. Khi tm c ng
i t A ti B th Delta[B] cho ta trng s nh nht ca cc cung trn ng tng lung.
Th ba, ngay trong bc tm ng tng lung, ta c th xc nh ngay cung no l cung thun,
cung no l cung nghch. V vy khi t nh u thm nh v trong BFS, ta c th vn lu vt ng
i Trace[v] := u, nhng sau s i du Trace[v] nu nh (u, v) l cung nghch.
Nhng ci tin cho ta mt cch ci t hiu qu hn, l:
IV. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962)
Mi nh v c gn nhn (Trace[v], Delta[v]). Trong Trace[v] l nh lin trc v trong
ng i t A ti v, Trace[v] m hay dng tu theo (Trace[v], v) l cung nghch hay cung
thun trn th tng lung, Delta[v] l trng s nh nht ca cc cung trn ng i t A ti v trn
th tng lung.
Bc lp s tm ng i t A ti B trn th tng lung ng thi tnh lun cc nhn (Trace[v],
Delta[v]). Sau tng lung dc theo ng tng lung nu tm thy.
PROG10_2.PAS * Thut ton Ford-Fulkerson
program Max_Flow_by_Ford_Fulkerson;
const
max = 100;
maxC = 10000;
var
c, f: array[1..max, 1..max] of Integer;
Trace: array[1..max] of Integer;
Delta: array[1..max] of Integer;
n, A, B: Integer;
procedure Enter;
{Nhp d liu}
var
m, i, u, v: Integer;
begin
FillChar(c, SizeOf(c), 0);
ReadLn(n, m, A, B);
for i := 1 to m do
ReadLn(u, v, c[u, v]);
end;
function Min(X, Y: Integer): Integer;
begin
if X < Y then Min := X else Min := Y;
end;
function FindPath: Boolean;
var
u, v: Integer;
Queue: array[1..max] of Integer;
First, Last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[v] = 0 ng ngha vi v cha nh du}
First := 1; Last := 1; Queue[1] := A;
Trace[A] := n + 1;
{Ch cn n khc 0 nh du m thi, s dng no cng c c}

L Minh Hong

L thuyt th

\ 86 [

Delta[A] := maxC;
{Khi to nhn}
repeat
u := Queue[First]; Inc(First);
{Ly u khi Queue}
for v := 1 to n do
if Trace[v] = 0 then
{Xt nhng nh v cha nh du thm}
begin
if f[u, v] < c[u, v] then
{Nu (u, v) l cung thun trn Gf v c trng s l c[u, v] - f[u, v]}
begin
Trace[v] := u;
{Lu vt, Trace[v] mang du dng}
Delta[v] := min(Delta[u], c[u, v] - f[u, v]);
end
else
if f[v, u] > 0 then
{Nu (u, v) l cung nghch trn Gf v c trng s l f[v, u]}
begin
Trace[v] := -u;
{Lu vt, Trace[v] mang du m}
Delta[v] := min(Delta[u], f[v, u]);
end;
if Trace[v] <> 0 then
{Trace[v] khc 0 tc l t u c th thm v}
begin
if v = B then
{C ng tng lung t A ti B}
begin
FindPath := True; Exit;
end;
Inc(Last); Queue[Last] := v; {a v vo Queue}
end;
end;
until First > Last;
{Hng i Queue rng}
FindPath := False;
{ trn khng Exit c tc l khng c ng}
end;
procedure IncFlow; {Tng lung dc ng tng lung}
var
IncValue, u, v: Integer;
begin
IncValue := Delta[B];
{Nhn Delta[B] chnh l trng s nh nht trn cc cung ca ng tng lung}
v := B;
{Truy vt ng i, tng lung dc theo ng i}
repeat
u := Trace[v];
{Xt cung (u, v) trn ng tng lung}
if u > 0 then f[u, v] := f[u, v] + IncValue
{(|u|, v) l cung thun th tng f[u, v]}
else
begin
u := -u;
f[v, u] := f[v, u] - IncValue;
{(|u|, v) l cung nghch th gim f[v, |u|]}
end;
v := u;
until v = A;
end;
procedure PrintResult;
{In kt qu}
var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v];
end;
WriteLn('Max Flow: ', m);
end;
begin
L Minh Hong

L thuyt th

\ 87 [

Assign(Input, 'MAXFLOW.INP'); Reset(Input);


Assign(Output, 'MAXFLOW.OUT'); Rewrite(Output);
Enter;
FillChar(f, SizeOf(f), 0);
repeat
if not FindPath then Break;
IncFlow;
until False;
PrintResult;
Close(Input);
Close(Output);
end.

nh l v lung cc i trong mng v lt ct hp nht:


Lung cc i trong mng bng kh nng thng qua ca lt ct hp nht. Khi tm c lung cc
i th theo thut ton trn s khng c ng i t A ti B trn th tng lung. Nu t tp X
gm nhng nh n c t nh pht A trn th tng lung (tt nhin AX) v tp Y gm
nhng nh cn li (tt nhin BY) th (X, Y) l lt ct hp nht . C th c nhiu lt ct hp
nht, v d nu t tp Y gm nhng nh n c nh thu B trn th tng lung (tt nhin B
Y) v tp X gm nhng nh cn li th (X, Y) cng l mt lt ct hp nht.
nh l v tnh nguyn:
Nu tt c cc kh nng thng qua l s nguyn th thut ton trn lun tm c lung cc i vi
lung trn cung l cc s nguyn. iu ny c th chng minh rt d bi ban u khi to lung 0
th tc cc lung trn cung l nguyn. Mi ln tng lung ln mt lng bng trng s nh nht trn
cc cung ca ng tng lung cng l s nguyn nn cui cng lung cc i tt s phi c lung
trn cc cung l nguyn.
nh l v chi ph thi gian thc hin gii thut:
Trong phng php Ford-Fulkerson, nu dng ng i ngn nht (qua t cnh nht) t nh pht
ti nh thu trn th tng lung th cn t hn n.m ln chn ng i tm ra lung cc i.
Edmonds v Karp chng minh tnh cht ny v ngh mt phng php ci tin: Ti mi bc,
ta nn tm ng tng lung sao cho gi tr tng lung c gia tng nhiu nht.
Ni chung i vi thut ton Ford-Fulkerson, cc nh gi l thuyt b lch rt nhiu so vi thc t,
mc d vi s phn tch trong trng hp xu, chi ph thi gian thc hin ca thut ton l kh ln.
Nhng trn thc t th thut ton ny hot ng rt nhanh v hiu qu.
Bi tp:
1. Mng vi nhiu im pht v nhiu im thu: Cho mt mng gm n nh vi p im pht A1,
A2, ..., Ap v q im thu B1, B2, ..., Bq. Mi cung ca mng c gn kh nng thng qua l s
nguyn. Cc nh pht ch c cung i ra v cc nh thu ch c cung i vo. Mt lung trn mng
ny l mt php gn cho mi cung mt s thc gi l lung trn cung khng vt qu kh nng
thng qua v tho mn vi mi nh khng phi nh pht hay nh thu th tng lung i vo bng
tng lung i ra. Gi tr lung bng tng lung i ra t cc nh pht = tng lung i vo cc nh
thu. Hy tm lung cc i trn mng.
2. Mng vi kh nng thng qua ca cc nh v cc cung: Cho mt mng vi nh pht A v
nh thu B. Mi cung (u, v) c gn kh nng thng qua c[u, v]. Mi nh v khc vi A v B c
gn kh nng thng qua d[v]. Mt lung trn mng c nh ngha nh trc v thm iu kin:
tng lung i vo nh v khng c vt qu kh nng thng qua d[v] ca nh . Hy tm lung
cc i trn mng.

L Minh Hong

L thuyt th

\ 88 [

3. Lt ct hp nht: Cho mt th lin thng gm n nh v m cnh, hy tm cch b i mt s t


nht cc cnh lm cho th mt i tnh lin thng
4. Tp i din: Mt lp hc c n bn nam, n bn n. Cho m mn qu lu nim, (n m). Mi bn
c s thch v mt s mn qu no . Hy tm cch phn cho mi bn nam tng mt mn qu cho
mt bn n tho mn:
Mi bn nam ch tng qu cho ng mt bn n
Mi bn n ch nhn qu ca ng mt bn nam
Bn nam no cng i tng qu v bn n no cng c nhn qu, mn qu phi hp s
thch ca c hai ngi.
Mn qu no c mt bn nam chn th bn nam khc khng c chn na.

L Minh Hong

L thuyt th

\ 89 [

11. BI TON TM B GHP CC I TRN TH HAI PHA


I. TH HAI PHA (BIPARTITE GRAPH)
Cc tn gi th hai pha, th lng phn, th phn i, th
i snh hai phn v.v... l ch chung mt dng n th v
hng G = (V, E) m tp nh ca n c th chia lm hai tp con X,
Y
Y ri nhau sao cho bt k cnh no ca th cng ni mt nh ca
X vi mt nh thuc Y. Khi ngi ta cn k hiu G l (XY, E) X
v gi mt tp (chng hn tp X) l tp cc nh tri v tp cn li
l tp cc nh phi ca th hai pha G. Cc nh thuc X cn
gi l cc X_nh, cc nh thuc Y gi l cc Y_nh.
kim tra mt th lin thng c phi l th hai pha hay khng, ta c th p dng thut ton
sau:
Vi mt nh v bt k:
X := {v}; Y := ;
repeat
Y := Y K(X);
X := X K(Y);
until (XY ) or (X v Y l ti i - khng b sung c na);
if XY then < Khng phi th hai pha >
else <y l th hai pha, X l tp cc nh tri: cc nh n c t v qua
mt s chn cnh, Y l tp cc nh phi: cc nh n c t v qua mt s l
cnh>;

th hai pha gp rt nhiu m hnh trong thc t. Chng hn quan h hn nhn gia tp nhng
ngi n ng v tp nhng ngi n b, vic sinh vin chn trng, thy gio chn tit dy trong
thi kho biu v.v...
II. BI TON GHP I KHNG TRNG V CC KHI NIM
Cho mt th hai pha G = (XY, E) y X l tp cc nh tri v Y l tp cc nh phi ca G
Mt b ghp (matching) ca G l mt tp hp cc cnh ca G i mt khng c nh chung.
Bi ton ghp i (matching problem) l tm mt b ghp ln nht (ngha l c s cnh ln nht)
ca G
Xt mt b ghp M ca G.
Cc nh trong M gi l cc nh ghp (matched vertices), cc nh khc l cha ghp.
Cc cnh trong M gi l cc cnh ghp, cc cnh khc l cha ghp
Nu nh hng li cc cnh ca th thnh cung, nhng cnh cha ghp c nh hng t X
sang Y, nhng cnh ghp nh hng t Y v X. Trn th nh hng : Mt ng i xut
pht t mt X_nh cha ghp gi l ng pha, mt ng i t mt X_nh cha ghp ti mt
Y_nh cha ghp gi l ng m.
Mt cch d hiu, c th quan nim nh sau:
Mt ng pha (alternating path) l mt ng i n trong G bt u bng mt X_nh cha
ghp, i theo mt cnh cha ghp sang Y, ri n mt cnh ghp v X, ri li n mt cnh
cha ghp sang Y... c xen k nhau nh vy.
Mt ng m (augmenting path) l mt ng pha. Bt u t mt X_nh cha ghp kt
thc bng mt Y_nh cha ghp.

L Minh Hong

L thuyt th

V d: vi th hai pha nh hnh bn, v b ghp


M = {(X1, Y1), (X2, Y2)}
X3 v Y3 l nhng nh cha ghp, cc nh khc l ghp
ng (X3, Y2, X2, Y1) l ng pha
ng (X3, Y2, X2, Y1, X1, Y3) l ng m.
III. THUT TON NG M

\ 90 [

X1

Y1

X2

Y2

X3

Y3

Thut ton ng m tm mt b ghp ln nht pht biu nh


X
Y
sau:
Bt u t mt b ghp bt k M (thng thng b ghp c
khi gn bng b ghp rng hay c tm bng cc thut ton tham lam)
Sau i tm mt ng m, nu tm c th m rng b ghp M nh sau: Trn ng m,
loi b nhng cnh ghp khi M v thm vo M nhng cnh cha ghp. Nu khng tm c
ng m th b ghp hin thi l ln nht.
<Khi to
while <C
<Dc
cha

mt b ghp M>;
ng m xut pht t x ti mt nh y cha ghp Y> do
trn ng m, xo b khi M cc cnh ghp v thm vo M nhng cnh
ghp, nh x v y tr thnh ghp, s cnh ghp tng ln 1>;

Nh v d trn, vi b ghp hai cnh M = {(X1, Y1), (X2, Y2)} v ng m tm c gm cc


cnh:
1. (X3, Y2) M
2. (Y2, X2) M
3. (X2, Y1) M
4. (Y1, X1) M
5. (X1, Y3) M
Vy th ta s loi i cc cnh (Y2, X2) v (Y1, X1) trong b ghp c v thm vo cc cnh (X3,
Y2), (X2, Y1), (X1, Y3) c b ghp 3 cnh.
IV. CI T
1. Biu din th hai pha
Gi s th hai pha G = (XY, E) c cc X_nh k hiu l X[1], X[2], ..., X[m] v cc Y_nh
k hiu l Y[1], Y[2], ..., Y[n]. Ta s biu din th hai pha ny bng ma trn A c mxn. Trong
:
A[i, j] = TRUE c cnh ni nh X[i] vi nh Y[j].
2. Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..m] v matchY[1..n].
matchX[i] l nh thuc tp Y ghp vi nh X[i]
matchY[j] l nh thuc tp X ghp vi nh Y[j].
Tc l nu nh cnh (X[i], Y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:
Nu nh X[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh Y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.
thm mt cnh (X[i], Y[j]) vo b ghp th ta ch vic t matchX[i] := j v matchY[j] := i;
loi mt cnh (X[i], Y[j]) khi b ghp th ta ch vic t matchX[i] := 0 v matchY[j] := 0;
L Minh Hong

L thuyt th

\ 91 [

3. Tm ng m nh th no.
V ng m bt u t mt X_nh cha ghp, i theo mt cnh cha ghp sang tp Y, ri theo
mt ghp v tp X, ri li mt cnh cha ghp sang tp Y ... cui cng l cnh cha ghp ti
mt Y_nh cha ghp. Nn c th thy ngay rng di ng m l l v trn ng m s cnh
M t hn s cnh M l 1 cnh. V cng d thy rng gii thut tm ng m nn s dng thut
ton tm kim theo chiu rng ng m tm c l ng i ngn nht, gim bt cng vic
cho bc tng cp ghp.
Ta khi to mt hng i (Queue) ban u cha tt c cc X_nh cha ghp. Thut ton tm kim
theo chiu rng lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t
v cha c thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt thc
Y_nh cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh j Y ghp,
da vo s kin: t j ch c th ti c matchY[j] theo duy nht mt cnh ghp nh hng
ngc t Y v X, nn ta c th nh du thm j, thm lun c matchY[j], v y vo Queue
phn t matchY[j] X (Thm lin 2 bc).
Input: file vn bn MATCH.INP

Dng 1: cha hai s m, n (m, n 100) theo th t l s X_nh v s Y_nh cch nhau t nht
mt du cch
Cc dng tip theo, mi dng ghi hai s i, j cch nhau t nht mt du cch th hin c cnh ni
hai nh (X[i], Y[j]) .
Output: file vn bn MATCH.OUT cha b ghp cc i tm c

2
5

MATCH.INP
4 5
1 1
1 4
2 1
2 2
2 4
3 2
3 3
4 2
4 3

MATCH.OUT
Match:
1) X[1] 2) X[2] 3) X[3] 4) X[4] -

Y[1]
Y[4]
Y[3]
Y[2]

PROG11_1.PAS * Thut ton ng m tm b ghp cc i


program MatchingProblem;
const
max = 100;
var
m, n: Integer;
a: array[1..max, 1..max] of Boolean;
matchX, matchY: array[1..max] of Integer;
Trace: array[1..max] of Integer;
procedure Enter;
{c d liu, (t thit b nhp chun)}
var
i, j: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(m, n);
L Minh Hong

L thuyt th

\ 92 [

while not SeekEof do


begin
ReadLn(i, j);
a[i, j] := True;
end;
end;
procedure Init;
{Khi to b ghp rng}
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
end;
{Tm ng m, nu thy tr v mt Y_nh cha ghp l nh kt thc ng m, nu khng thy tr v 0}

function FindAugmentingPath: Integer;


var
Queue: array[1..max] of Integer;
i, j, first, last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[j] = X_nh lin trc Y[j] trn ng m}
last := 0;
{Khi to hng i rng}
for i := 1 to m do
{y tt c nhng X_nh cha ghp vo hng i}
if matchX[i] = 0 then
begin
Inc(last);
Queue[last] := i;
end;
{Thut ton tm kim theo chiu rng}

first := 1;
while first <= last do
begin
i := Queue[first]; Inc(first); {Ly mt X_nh ra khi Queue (X[i])}
for j := 1 to n do
{Xt nhng Y_nh cha thm k vi X[i] qua mt cnh cha ghp}
if (Trace[j] = 0) and a[i, j] and (matchX[i] <> j) then
begin {lnh if trn hi tha k matchX[i] <> j, iu kin Trace[j] = 0 bao hm lun iu kin ny ri}
Trace[j] := i;
{Lu vt ng i}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ng m v thot ngay}
begin
FindAugmentingPath := j;
Exit;
end;
Inc(last);
{y lun matchY[j] vo hng i}
Queue[last] := matchY[j];
end;
end;
FindAugmentingPath := 0; { trn khng Exit c tc l khng cn ng m}
end;
{Ni rng b ghp bng ng m kt thc fY}

procedure Enlarge(f: Integer);


var
x, next: Integer;
begin
repeat
x := Trace[f];
next := matchX[x];
matchX[x] := f;
matchY[f] := x;
f := next;
until f = 0;
end;
procedure Solve;
var
L Minh Hong

{Thut ton ng m}

next
... ...

next
... ...

L thuyt th

\ 93 [

finish: Integer;
begin
repeat
finish := FindAugmentingPath;
{u tin th tm mt ng m}
if finish <> 0 then Enlarge(finish);
{Nu thy th tng cp v lp li}
until finish = 0;
{Nu khng thy th dng}
end;
procedure PrintResult;
{In kt qu}
var
i, Count: Integer;
begin
WriteLn('Match: ');
Count := 0;
for i := 1 to m do
if matchX[i] <> 0 then
begin
Inc(Count);
WriteLn(Count, ') X[', i, '] - Y[', matchX[i], ']');
end;
end;
begin
Assign(Input, 'MATCH.INP'); Reset(Input);
Assign(Output, 'MATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
PrintResult;
Close(Input);
Close(Output);
end.

Kho st tnh ng n ca thut ton cho ta mt kt qu kh th v:


Nu ta thm mt nh A v cho thm m cung
t A ti tt c nhng nh ca tp X, thm
mt nh B v ni thm n cung t tt c cc
nh ca Y ti B. Ta c mt mng vi nh A
B
pht A v nh thu B. Nu t kh nng thng
qua ca cc cung u l 1 sau tm lung
cc i trn mng bng thut ton FordX
Y
Fulkerson th theo nh l v tnh nguyn,
lung tm c trn cc cung u phi l s nguyn (tc l bng 1 hoc 0). Khi d thy rng
nhng cung c lung 1 t tp X ti tp Y s cho ta mt b ghp ln nht. chng minh thut ton
ng m tm c b ghp ln nht sau hu hn bc, ta s chng minh rng s b ghp tm c
bng thut ton ng m s bng gi tr lung cc i ni trn, iu cng rt d bi v nu
k mt cht th ng m chng qua l ng tng lung trn th tng lung m thi, ngay ci
tn augmenting path cho ta bit iu ny. V vy thut ton ng m trng hp ny l mt
cch ci t hiu qu trn mt dng th c bit, n lm cho chng trnh sng sa hn nhiu
so vi phng php tm b ghp da trn bi ton lung v thut ton Ford-Fulkerson thun ty.
Ngi ta chng minh c chi ph thi gian thc hin gii thut ny trong trng hp xu nht
s l O(n3) i vi th dy v O(n(n + m)logn) i vi th tha. Tuy nhin, cng ging nh
thut ton Ford-Fulkerson, trn thc t phng php ny hot ng rt nhanh.
Bi tp
L Minh Hong

L thuyt th

\ 94 [

1. C n th v n cng vic (n 100), mi th thc hin c t nht mt vic. Nh vy mt th c


th lm c nhiu vic, v mt vic c th c nhiu th lm c. Hy phn cng n th thc hin
n vic sao cho mi th phi lm ng 1 vic hoc thng bo rng khng c cch phn cng no
tho mn iu trn.
2. C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no,
hy phn cng cc th lm cc cng vic sao cho mi th phi lm t nht 2 vic v s vic thc
hin c l nhiu nht.
3. C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no,
hy phn cng thc hin cc cng vic sao cho s cng vic phn cho ngi th lm nhiu nht
thc hin l cc tiu.

L Minh Hong

L thuyt th

\ 95 [

12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN


TH HAI PHA - THUT TON HUNGARI
I. BI TON PHN CNG

y l mt dng bi ton pht biu nh sau: C m ngi (nh s 1, 2, ..., m) v n cng vic
(nh s 1, 2, ..., n), mi ngi c kh nng thc hin mt s cng vic no . giao cho
ngi i thc hin cng vic j cn mt chi ph l c[i, j] 0. Cn phn cho mi th mt vic v
mi vic ch do mt th thc hin sao cho s cng vic c th thc hin c l nhiu nht v
nu c 2 phng n u thc hin c nhiu cng vic nht th ch ra phng n chi ph t
nht.
Dng th hai pha G = (XY, E) vi X l tp m ngi, Y l tp n vic v (u, v) E vi
trng s c[u, v] nu nh ngi u lm c cng vic v. Bi ton a v tm b ghp nhiu
cnh nht ca G c trng s nh nht.
Gi k = max(m, n). B sung vo tp X v Y mt s nh gi X=Y= k.
Gi M l mt s dng ln hn chi ph ca mi php phn cng c th. Vi mi cp nh
(u, v): u X v v Y. Nu (u, v) E th ta b sung cnh (u, v) vo E vi trng s l M.
Khi ta c G l mt th hai pha y ( th hai pha m gia mt nh bt k ca
X v mt nh bt k ca Y u c cnh ni). V nu nh ta tm c b ghp y k
cnh mang trng s nh nht th ta ch cn loi b khi b ghp nhng cnh mang
trng s M va thm vo th s c k hoch phn cng 1 ngi 1 vic cn tm. iu
ny d hiu bi b ghp y mang trng s nh nht tc l phi t cnh trng s M nht,
tc l s php phn cng l nhiu nht, v tt nhin trong s cc phng n ghp t cnh trng
s M nht th y l phng n trng s nh nht, tc l tng chi ph trn cc php phn cng
l t nht.

II. PHN TCH

Vo: th hai pha y G = (XY, E); X=Y= k. c cho bi ma trn vung C c


kxk, c[i, j] = trng s cnh ni nh Xi vi Yj. Gi thit c[i, j] 0. vi mi i, j.

Ra: B ghp y trng s nh nht.


Hai nh l sau y tuy rt n gin nhng l nhng nh l quan trng to c s cho thut ton s
trnh by:
nh l 1: Loi b khi G nhng cnh trng s > 0. Nu nhng cnh trng s 0 cn li to ra b
ghp k cnh trong G th y l b ghp cn tm.
Chng minh: Theo gi thit, cc cnh ca G mang trng s khng m nn bt k b ghp no trong
G cng c trng s khng m, m b ghp trn mang trng s 0, nn tt nhin l b ghp y
trng s nh nht.
nh l 2: Vi nh Xi, nu ta cng thm mt s (dng hay m) vo tt c nhng cnh lin
thuc vi Xi (tng ng vi vic cng thm vo tt c cc phn t thuc hng i ca ma trn
C) th khng nh hng ti b ghp y trng s nh nht.
Chng minh: Vi mt b ghp y bt k th c mt v ch mt cnh ghp vi X[i]. Nn vic
cng thm vo tt c cc cnh lin thuc vi X[i] s lm tng trng s b ghp ln . V vy

L Minh Hong

L thuyt th

\ 96 [

nu nh ban u, M l b ghp y trng s nh nht th sau thao tc trn, M vn l b ghp y


trng s nh nht.
H qu: Vi nh Y[j], nu ta cng thm mt s (dng hay m) vo tt c nhng cnh lin thuc
vi Y[j] (tng ng vi vic cng thm vo tt c cc phn t thuc ct j ca ma trn C) th
khng nh hng ti b ghp y trng s nh nht.
T y c th nhn ra t tng ca thut ton: T th G, ta tm chin lc cng / tr mt
cch hp l trng s ca cc cnh lin thuc vi mt nh no c mt th mi vn c
cc cnh trng s khng m, m cc cnh trng s 0 ca th mi cha mt b ghp y
k cnh.
V d: Bin i ma trn trng s ca th hai pha 3 nh tri, 3 nh phi:

-1
-1

0 0 0
0 1 7
0 8 9

1 0 0
0 0 6
0 7 8

X[1] - Y[3]
X[2] - Y[2]
X[3] - Y[1]

+1

III. THUT TON


1. Cc khi nim:
cho gn, ta gi nhng cnh trng s 0 ca G l nhng 0_cnh.
Xt mt b ghp M ch gm nhng 0_cnh.

Nhng nh M gi l nhng nh ghp, nhng nh cn li gi l nhng nh cha ghp.

Nhng 0_cnh M gi l nhng 0_cnh ghp, nhng 0_cnh cn li l nhng 0_cnh


cha ghp.
Nu ta nh hng li cc 0_cnh nh sau: Nhng 0_cnh cha ghp cho hng t tp X sang tp
Y, nhng 0_cnh ghp cho hng t tp Y v tp X. Khi :

ng pha (Alternating Path) l mt ng i c bn xut pht t mt X_nh cha ghp i


theo cc 0_cnh nh hng trn. Nh vy dc trn ng pha, cc 0_cnh cha ghp v
nhng 0_cnh ghp xen k nhau. V ng pha ch l ng i c bn trn th nh
hng nn vic xc nh nhng nh no c th n c t x X bng mt ng pha c
th s dng cc thut ton tm kim trn th (BFS hoc DFS). Nhng nh v nhng cnh
c duyt qua to thnh mt cy pha gc x

Mt ng m (Augmenting Path) l mt ng pha i t mt X_nh cha ghp ti mt


Y_nh cha ghp. Nh vy:
ng i trc tip t mt X_nh cha ghp ti mt Y_nh cha ghp qua mt 0_cnh
cha ghp cng l mt ng m.
Dc trn ng m, s 0_cnh cha ghp nhiu hn s 0_cnh ghp ng 1 cnh.
2. Thut ton Hungari
Bc 1: Khi to:

Mt b ghp M :=
Bc 2: Vi mi nh x*X, ta tm cch ghp x* nh sau.
L Minh Hong

L thuyt th

\ 97 [

Bt u t nh x* cha ghp, th tm ng m bt u x* bng thut ton tm kim trn th


(BFS hoc DFS - thng thng nn dng BFS tm ng qua t cnh nht) c hai kh nng xy
ra:

Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v


thm vo M nhng cnh cha ghp, ta c mt b ghp mi nhiu hn b ghp c 1 cnh
v nh x* tr thnh ghp.

Hoc khng tm c ng m th do ta s dng thut ton tm kim trn th nn c th


xc nh c hai tp:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
Gi l trng s nh nht ca cc cnh ni gia mt nh thuc VisitedX vi mt nh
khng thuc VisitedY. D thy > 0 bi nu = 0 th tn ti mt 0_cnh (x, y) vi
xVisitedX v yVisitedY. V x* n c x bng mt ng pha v (x, y) l mt
0_cnh nn x* cng n c y bng mt ng pha, dn ti y VisitedY, iu ny v
l.
Bin i th G nh sau: Vi x VisitedX, tr vo trng s nhng cnh lin
thuc vi x, Vi y VisitedY, cng vo trng s nhng cnh lin thuc vi y.
Lp li th tc tm kim trn th th tm ng m xut pht x* cho ti khi tm ra
ng m.
Bc 3: Sau bc 2 th mi X_nh u c ghp, in kt qu v b ghp tm c.
M hnh ci t ca thut ton c th vit nh sau:
<Khi to: M := ...>;
for (x*X) do
begin
repeat
<Tm ng m xut pht x*>;
if <Khng tm thy ng m> then <Bin i th G: Chn := ...>;
until <Tm thy ng m>;
<Dc theo ng m, loi b nhng cnh ghp khi M
v thm vo M nhng cnh cha ghp>;
end;
<Kt qu>;

V d minh ho:
khng b ri hnh, ta hiu nhng cnh khng ghi trng s l nhng 0_cnh, nhng cnh khng
v mang trng s rt ln trong trng hp ny khng cn thit phi tnh n. Nhng cnh nt m
l nhng cnh ghp, nhng cnh nt thanh l nhng cnh cha ghp.

L Minh Hong

L thuyt th

\ 98 [

X1

Y1

x* = X1

X1

Y1

Tm c ng m:
X2

Y2
2

X1 Y1

X2

Y2
2

1
X3

1
Y3

X4

X1

Tng cp

Y4

Y1

X3

Y3

X4

x* = X2

X1

Y4

Y1

Tm c ng m:
X2

Y2
2

X2 Y1 X1 Y2

X2

Y2
2

1
X3

1
Y3

X4

X1

Tng cp

Y4

Y1

X3

Y3

X4

x* = X3

X1

Y4

Y1

Tm c ng m:
X2

Y2
2

X3 Y3

X2

Y2
2

1
X3

1
Y3

X4

X1

Y4

Y1

X2

Y2
2
1=

X3

X4

L Minh Hong

Y3

Tng cp

Y4

X3

Y3

X4

x* = X4
Khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha: {X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha: {Y3}
Gi tr xoay = 1 (Cnh X3-Y2)
Tr tt c trng s nhng cnh lin
thuc vi {X3, X4} i 1
Cng tt c trng s nhng cnh lin
thuc vi Y3 ln 1

X1

Y4

Y1

X2

Y2
2
0

X3

X4

Y3

Y4

L thuyt th

\ 99 [

X1

Y1

X2

Y2
2=

X3

Y3

X4

X1

Y4

Y1

x* = X4
Vn khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha:
{X1, X2, X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha:
{Y1, Y2, Y3}
Gi tr xoay = 2 (Cnh X2-Y4)
Tr tt c trng s nhng cnh lin
thuc vi {X1, X2, X3, X4} i 2
Cng tt c trng s nhng cnh lin
thuc vi {Y1, Y2, Y3} ln 2

x* = X4

X1

Y1

X2

Y2
0

X3

X4

Y3

Y4

X1

Y1

X2

Y2

X3

Y3

Tm c ng m:
X2

Y2
0

X3

Y3

X4 Y3 X3 Y2 X1 Y1
X2 Y4
Tng cp
Xong

X4

Y4

X4

Y4

rng nu nh khng tm thy ng m xut pht x* th qu trnh tm kim trn th s cho


ta mt cy pha gc x*. Gi tr xoay thc cht l trng s nh nht ca cnh ni mt X_nh trong
cy pha vi mt Y_nh ngoi cy pha (cnh ngoi). Vic tr vo nhng cnh lin thuc vi
X_nh trong cy pha v cng vo nhng cnh lin thuc vi Y_nh trong cy pha s lm cho
cnh ngoi ni trn tr thnh 0_cnh, cc cnh khc vn c trng s 0. Nhng quan trng hn l
tt c nhng cnh trong cy pha vn c l 0_cnh. iu m bo cho qu trnh tm kim trn
th ln sau s xy dng c cy pha mi ln hn cy pha c (Th hin ch: tp VisitedY s
rng hn trc t nht 1 phn t). V tp cc Y_ nh ghp l hu hn nn sau khng qu k
bc, s c mt Y_nh cha ghp VisitedY, tc l tm ra ng m
Trn thc t, chng trnh hot ng nhanh hn, trong bc khi to, ngi ta c th thm mt
thao tc:
Vi mi nh x X, xc nh trng s nh nht ca cc cnh lin thuc vi x, sau tr tt c
trng s cc cnh lin thuc vi x i trng s nh nht . Lm tng t nh vy vi cc Y_nh.
iu ny tng ng vi vic tr tt c cc phn t trn mi hng ca ma trn C i gi tr nh
nht trn hng , ri li tr tt c cc phn t trn mi ct ca ma trn C i phn t nh nht trn
ct . Khi s 0_cnh ca th l kh nhiu, c th cha ngay b ghp y hoc ch cn qua
t bc bin i l s cha b ghp y k cnh.
tng nh hai nh ton hc Knig v Egervary, nhng ngi t c s l thuyt u tin cho
phng php, ngi ta ly tn ca t nc sinh ra hai nh ton hc ny t tn cho thut

L Minh Hong

L thuyt th

\ 100 [

ton. Mc d sau ny c mt s ci tin nhng tn gi Thut ton Hungari (Hungarian Algorithm)


vn c dng ph bin.
IV. CI T
1. Phng php i ngu Kuhn-Munkres (Khng lm bin i ma trn C ban u)
Phng php Kuhn-Munkres i tm hai dy s Fx[1..k] v Fy[1..k] tho mn:

c[i, j] - Fx[i] - Fy[j] 0

Tp cc cnh (X[i], Y[j]) tho mn c[i, j] - Fx[i] - Fy[j] = 0 cha trn mt b ghp y k
cnh, y chnh l b ghp cn tm.
Chng minh:
Nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh X[i], tr tt c trng s ca nhng cnh lin thuc vi X[i] i Fx[i]
Vi mi nh Y[j], tr tt c trng s ca nhng cnh lin thuc vi Y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (X[i], Y[j]) i mt lng
Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
1
2
3
4
0
0
M
M
Fx[1] = 2
1
2
0
M
M
2
Fx[2] = 2
3
M
1
0
M
Fx[3] = 3
4
M
M
0
9
Fx[4] = 3
Fy[1] = -2 Fy[2] = -2 Fy[3] = -3 Fy[4] = 0
(C nhiu phng n khc: Fx = (0, 0, 1, 1); Fy = (0, 0, -1, 2) cng ng)

Vy phng php Kuhn-Munkres a vic bin i th G (bin i ma trn C) v vic bin i


hay dy s Fx v Fy. Vic tr vo trng s tt c nhng cnh lin thuc vi X[i] tng ng vi
vic tng Fx[i] ln . Vic cng vo trng s tt c nhng cnh lin thuc vi Y[j] tng ng
vi gim Fy[j] i . Khi cn bit trng s cnh (X[i], Y[j]) l bao nhiu sau cc bc bin i, thay
v vit c[i, j], ta vit c[i, j] - Fx[i] - Fy[j].
V d: Th tc tm ng m trong thut ton Hungari i hi phi xc nh c cnh no l
0_cnh, khi ci t bng phng php Kuhn-Munkres, vic xc nh cnh no l 0_cnh c th
kim tra bng ng thc: c[i, j] - Fx[i] - Fy[j] = 0 hay c[i, j] = Fx[i] + Fy[j].
S ci t phng php Kuhn-Munkres c th vit nh sau:
Bc 1: Khi to:
M := ;
Vic khi to cc Fx, Fy c th c nhiu cch chng hn Fx[i] := 0; Fy[j] := 0 vi i, j.
Hoc: Fx[i] := min (c[i, j]) vi i. Sau t Fy[j] := min (c[i, j] Fx[i]) vi j.
1 j k

1i k

(Min sao c[i, j] - Fx[i] - Fy[j] 0)


Bc 2: Vi mi nh x*X, ta tm cch ghp x* nh sau:

L Minh Hong

L thuyt th

\ 101 [

Bt u t nh x*, th tm ng m bt u x* bng thut ton tm kim trn th (BFS hoc


DFS). Lu rng 0_cnh l cnh tho mn c[i, j] = Fx[i] + Fy[j]. C hai kh nng xy ra:

Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v


thm vo M nhng cnh cha ghp.

Hoc khng tm c ng m th xc nh c hai tp:


VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
t := min{c[i, j] - Fx[i] - Fy[j] X[i] VisitedX; Y[j] VisitedY}
Vi X[i] VisitedX: Fx[i] := Fx[i] + ;
Vi Y[j] VisitedY: Fy[j] := Fy[j] - ;
Lp li th tc tm ng m xut pht ti x* cho ti khi tm ra ng m.
ng lu phng php Kuhn-Munkres l n khng lm thay i ma trn C ban u. iu
thc s hu ch trong trng hp trng s ca cnh (X[i], Y[j]) khng c cho mt cch tng
minh bng gi tr C[i, j] m li cho bng hm c(i, j): trong trng hp ny, vic tr hng/cng ct
trc tip trn ma trn chi ph C l khng th thc hin c.
2. Di y ta s ci t chng trnh gii bi ton phn cng bng thut ton Hungari vi
phng php i ngu Kuhn-Munkres:
a) Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..k] v matchY[1..k].

matchX[i] l nh thuc tp Y ghp vi nh X[i]

matchY[j] l nh thuc tp X ghp vi nh Y[j].


Tc l nu nh cnh (X[i], Y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:

Nu nh X[i] cha ghp vi nh no ca tp Y th matchX[i] = 0

Nu nh Y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.

thm mt cnh (X[i], Y[j]) vo b ghp th ch vic t matchX[i] := j v matchY[j] := i;

loi mt cnh (X[i], Y[j]) khi b ghp th ch vic t matchX[i] := 0 v matchY[j] := 0;


b) Tm ng m nh th no
Ta s tm ng m v xy dng hai tp VisitedX v VisitedY bng thut ton tm kim theo chiu
rng ch xt ti nhng nh v nhng 0_cnh nh hng nh ni trong phn u:
Khi to mt hng i (Queue) ban u ch c mt nh x*. Thut ton tm kim theo chiu rng
lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t v cha c
thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt thc Y_nh
cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh y Y ghp, da vo
s kin: t y ch c th ti c matchY[y] theo duy nht mt 0_cnh nh hng, nn ta c th
nh du thm y, thm lun c matchY[y], v y vo Queue phn t matchY[y] X.
3. Nhp d liu t file vn bn ASSIGN.INP

Dng 1: Ghi hai s m, n theo th t l s th v s vic cch nhau 1 du cch (m, n 100)
Cc dng tip theo, mi dng ghi ba s i, j, c[i, j] cch nhau 1 du cch th hin th i lm c
vic j v chi ph lm l c[i, j] (1 i m; 1 j n; 0 c[i, j] 100).

L Minh Hong

L thuyt th

\ 102 [

Y
6

ASSIGN.INP
5 6
1 1 0
1 2 0
2 1 0
2 4 2
3 2 1
3 3 0
4 3 0
4 4 9
5 4 9

ASSIGN.OUT
Optimal assignment:
1) X[1] - Y[1]
2) X[2] - Y[4]
3) X[3] - Y[2]
4) X[4] - Y[3]
Cost: 3

0
2
1
0

19
5

PROG12_1.PAS * Thut ton Hungari


program AssignmentProblemSolve;
const
max = 100;
maxC = 10001;
var
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY, Trace: array[1..max] of Integer;
m, n, k, start, finish: Integer;
{ng m s bt u t startX v kt thc finishY}
procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i, j: Integer;
begin
ReadLn(m, n);
if m > n then k := m else k := n;
for i := 1 to k do
for j := 1 to k do c[i, j] := maxC;
while not SeekEof do ReadLn(i, j, c[i, j]);
end;
procedure Init;
var
i, j: Integer;
begin

{Khi to}

{B ghp rng}

FillChar(matchX, SizeOf(matchX), 0);


FillChar(matchY, SizeOf(matchY), 0);
{Fx[i] := Trng s nh nht ca cc cnh lin thuc vi X[i]}

for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
end;
{Fy[j] := Trng s nh nht ca cc cnh lin thuc vi Y[j]}

for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do {Lu l trng s cnh (x[i], y[j]) by gi l c[i, j] - Fx[i] ch khng cn l c[i, j] na}
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
{Vic khi to cc Fx v Fy nh th ny ch n gin l cho s 0_cnh tr nn cng nhiu cng tt m thi}
{Ta hon ton c th khi gn cc Fx v Fy bng gi tr 0}

L Minh Hong

L thuyt th

\ 103 [

end;
{Hm cho bit trng s cnh (X[i], Y[j]) }

function GetC(i, j: Integer): Integer;


begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure FindAugmentingPath; {Tm ng m bt u start}
var
Queue: array[1..max] of Integer;
i, j, first, last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0);
{Trace[j] = X_nh lin trc Y[j] trn ng m}
{Thut ton BFS}

Queue[1] := start;
{y start vo hng i}
first := 1; last := 1;
repeat
i := Queue[first]; Inc(first); {Ly mt nh X[i] khi hng i}
for j := 1 to k do
{Duyt nhng Y_nh cha thm k vi X[i] qua mt 0_cnh cha ghp}
if (Trace[j] = 0) and (GetC(i, j) = 0) then
begin
Trace[j] := i;
{Lu vt ng i, cng vi vic nh du (0) lun}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ni kt thc ng m v thot lun}
begin
finish := j;
Exit;
end;
Inc(last); Queue[last] := matchY[j]; {y lun matchY[j] vo Queue}
end;
until first > last;
{Hng i rng}
end;
procedure SubX_AddY;
{Xoay cc trng s cnh}
var
i, j, t, Delta: Integer;
VisitedX, VisitedY: set of Byte;
begin
(* rng:
VisitedY = {y | Trace[y] 0}
VisitedX = {start} match(VisitedY) = {start} {matchY[y] | Trace[y] 0}
*)

VisitedX := [start];
VisitedY := [];
for j := 1 to k do
if Trace[j] <> 0 then
begin
Include(VisitedX, matchY[j]);
Include(VisitedY, j);
end;
{Sau khi xc nh c VisitedX v VisitedY, ta tm l trng s nh nht ca cnh ni t VisitedX ra Y\VisitedY}

Delta := maxC;
for i := 1 to k do
if i in VisitedX then
for j := 1 to k do
if not (j in VisitedY) and (GetC(i, j) < Delta) then
Delta := GetC(i, j);
{Xoay trng s cnh}

for t := 1 to k do
begin
{Tr trng s nhng cnh lin thuc vi VisitedX i Delta}

if t in VisitedX then Fx[t] := Fx[t] + Delta;


{Cng trng s nhng cnh lin thuc vi VisitedY ln Delta}

if t in VisitedY then Fy[t] := Fy[t] - Delta;


end;

L Minh Hong

L thuyt th

\ 104 [

end;
{Ni rng b ghp bi ng m tm c}

procedure Enlarge;
var
x, next: Integer;
begin
repeat
x := Trace[finish];
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;

finish

finish

next

next

... ...

... ...

start

start

procedure Solve;
{Thut ton Hungari}
var
x, y: Integer;
begin
for x := 1 to k do
begin
start := x; finish := 0; {Khi gn ni xut pht ng m, finish = 0 ngha l cha tm thy ng m}
repeat
FindAugmentingPath;
{Th tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh v lp li}
until finish <> 0;
{Cho ti khi tm thy ng m}
Enlarge;
{Tng cp da trn ng m tm c}
end;
end;
procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {In ra php phn cng th ch cn xt n m, khng cn xt n k}
begin
y := matchX[x];
{Nhng cnh c trng s maxC tng ng vi mt th khng c giao vic v mt vic khng c phn cng}

if c[x, y] < maxC then


begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, ']
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;

', c[x, y]);

begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.

Nhn xt:
1.
Nu ci t nh trn th cho d th c cnh mang trng s m, chng trnh vn tm c
b ghp cc i vi trng s cc tiu. L do: Ban u, ta tr tt c cc phn t trn mi hng
L Minh Hong

L thuyt th

2.
3.

\ 105 [

ca ma trn C i gi tr nh nht trn hng , ri li tr tt c cc phn t trn mi ct ca


ma trn C i gi tr nh nht trn ct (Php tr y lm gin tip qua cc Fx, Fy ch
khng phi tr trc tip trn ma trn C). Nn sau bc ny, tt c cc cnh ca th s c
trng s khng m bi phn t nh nht trn mi ct ca C chc chn l 0.
Sau khi kt thc thut ton, tng tt c cc phn t hai dy Fx, Fy bng trng s cc tiu ca
b ghp y tm c trn th ban u.
Mt vn na phi ht sc cn thn trong vic c lng ln ca cc phn t Fx v Fy.
Nu nh gi thit cho cc trng s khng qu 500 th ta khng th da vo bt ng thc
Fx(x) + Fy(y) c(x, y) m khng nh cc phn t trong Fx v Fy cng 500. Hy t tm v
d hiu r hn bn cht thut ton.

V. BI TON TM B GHP CC I VI TRNG S CC I TRN TH


HAI PHA
Bi ton tm b ghp cc i vi trng s cc i cng c th gii nh phng php Hungari bng
cch i du tt c cc phn t ma trn chi ph (Nh nhn xt 1).
Khi ci t, ta c th sa li i cht trong chng trnh trn gii bi ton tm b ghp cc i
vi trng s cc i m khng cn i du trng s. C th nh sau:
Bc 1: Khi to:

M := ;

Khi to hai dy Fx v Fy tho mn: i, j: Fx[i] + Fy[j] c[i, j]; Chng hn ta c th t


Fx[i] := Phn t ln nht trn dng i ca ma trn C v t cc Fy[j] := 0.
Bc 2: Vi mi nh x*X, ta tm cch ghp x* nh sau:
Vi cch hiu 0_cnh l cnh tho mn c[i, j] = Fx[i] + Fy[j]. Bt u t nh x*, th tm ng m
bt u x*. C hai kh nng xy ra:

Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v


thm vo M nhng cnh cha ghp.

Hoc khng tm c ng m th xc nh c hai tp:


VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
t := min{Fx[i] + Fy[j] - c[i, j] X[i] VisitedX; Y[j] VisitedY}
Vi X[i] VisitedX: Fx[i] := Fx[i] - ;
Vi Y[j] VisitedY: Fy[j] := Fy[j] + ;
Lp li th tc tm ng m xut pht ti x* cho ti khi tm ra ng m.
Bc 3: Sau bc 2 th mi X_nh u ghp, ta c mt b ghp y k cnh vi trng s
ln nht.
D dng chng minh c tnh ng n ca phng php, bi nu ta t:
c'[i, j] = - c[i, j]; F'x[i] := - Fx[i]; F'y[j] = - Fy[j].
Th bi ton tr thnh tm cp ghp y trng s cc tiu trn th hai pha vi ma trn trng s
c'[1..k, 1..k]. Bi ton ny c gii quyt bng cch tnh hai dy i ngu F'x v F'y. T bng
nhng bin i i s c bn, ta c th kim chng c tnh tng ng gia cc bc ca
phng php nu trn vi cc bc ca phng php Kuhn-Munkres mc trc.

L Minh Hong

L thuyt th

\ 106 [

VI. PHC TP TNH TON


Da vo m hnh ci t thut ton Kuhn-Munkres trn, ta c th nh gi v phc tp tnh
ton l thuyt ca cch ci t ny:
Thut ton tm kim theo chiu rng c s dng tm ng m c phc tp O(k2), mi ln
xoay trng s cnh mt mt chi ph thi gian c O(k2). Vy mi ln tng cp, cn ti a k ln d
ng v k ln xoay trng s cnh, mt mt chi ph thi gian c O(k3). Thut ton cn k ln tng
cp nn phc tp tnh ton trn l thuyt ca phng php ny c O(k4).
C th ci tin m hnh ci t c mt thut ton vi phc tp O(k3) da trn nhng nhn
xt sau:
Nhn xt 1:
Qu trnh tm kim theo chiu rng bt u t mt nh x* cha ghp cho ta mt cy pha gc x*.
Nu tm c ng m th dng li v tng cp ngay, nu khng th xoay trng s cnh v bt u
tm kim li c mt cy pha mi ln hn cy pha c:
x*

x*

y1 +

x1

+ y2

x2

y1

y2

x1

x2

y3

x3 -

y4 +

y5 +

y7

y3

y4

y5

y7

X4 -

X5 -

X7

x3

X4

X5

X7

y6

y6
Augmenting path found

Hnh 23: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng

Nhn xt 2:
Vic xc nh trng s nh nht ca cnh ni mt X_nh trong cy pha vi mt Y_nh ngoi cy
pha c th kt hp ngay trong bc dng cy pha m khng lm tng cp phc tp tnh ton.
thc hin iu ny, ta s dng k thut nh trong thut ton Prim:
Vi mi yY, gi d[y] := khong cch t y n cy pha gc x*. Ban u d[y] c khi to bng
trng s cnh (x*, y) = c[x*, y] - Fx[x*] - Fy[y] (cy pha ban u ch c ng mt nh x*).
Trong bc tm ng bng BFS, mi ln rt mt nh x ra khi Queue, ta xt nhng nh yY
cha thm v t li d[y]mi := min(d[y]c, trng s cnh (x, y)) sau mi kim tra xem (x, y) c
phi l 0_cnh hay khng tip tc cc thao tc nh trc. Nu qu trnh BFS khng tm ra ng
m th gi tr xoay chnh l gi tr nh nht trong cc d[y] dng. Ta bt c mt on chng
trnh tm gi tr xoay c phc tp O(k2). Cng vic ti mi bc xoay ch l tm gi tr nh nht
trong cc d[y] dng v thc hin php cng, tr trn hai dy i ngu Fx v Fy, n c phc tp
tnh ton O(k), ti a c k ln xoay tm ng m nn tng chi ph thi gian thc hin cc ln
xoay cho ti khi tm ra ng m c O(k2). Lu rng th ang xt l th hai pha y nn
sau khi xoay cc trng s cnh bng gi tr xoay , tt c cc cnh ni t X_nh trong cy pha ti
L Minh Hong

L thuyt th

\ 107 [

Y_nh ngoi cy pha u b gim trng s i , chnh v vy ta phi tr tt c cc d[y] > 0 i


gi c tnh hp l ca cc d[y].
Nhn xt 3:
Ta c th tn dng kt qu ca qu trnh tm kim theo chiu rng bc trc ni rng cy pha
cho bc sau (grow alternating tree) m khng phi tm li t u (BFS li bt u t x*).
Khi khng tm thy ng m, qu trnh tm kim theo chiu rng s nh du c nhng nh
thm (thuc cy pha) v hng i cc X_nh trong qu trnh tm kim tr thnh rng. Tip theo l
phi xc nh c = trng s nh nht ca cnh ni mt X_nh thm vi mt Y_nh cha
thm v xoay cc trng s cnh nhng cnh ny tr thnh 0_cnh. Ti y ta s dng k thut
sau: Thm lun nhng nh yY cha thm to vi mt X_nh thm mt 0_cnh (nhng
Y_nh cha thm c d[y] = 0), nu tm thy ng m th dng ngay, nu khng thy th y tip
nhng nh matchY[y] vo hng i v lp li thut ton tm kim theo chiu rng bt u t nhng
nh ny. Vy nu xt tng th, mi ln tng cp ta ch thc hin mt ln dng cy pha, tc l tng
chi ph thi gian ca nhng ln thc hin gii thut tm kim trn th sau mi ln tng cp ch
cn l O(k2).
Nhn xt 4:
Th tc tng cp da trn ng m (Enlarge) c phc tp O(k)
T 3 nhn xt trn, phng php i ngu Kuhn-Munkres c th ci t bng mt chng trnh c
phc tp tnh ton O(k3) bi n cn k ln tng cp v chi ph cho mi ln l O(k2).
PROG12_2.PAS * Ci t phng php Kuhn-Munkres O(n3)
program AssignmentProblemSolve;
const
max = 100;
maxC = 10001;
var
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY: array[1..max] of Integer;
Trace, Queue, d, arg: array[1..max] of Integer;
first, last: Integer;
start, finish: Integer;
m, n, k: Integer;
procedure Enter;
{Nhp d liu}
var
i, j: Integer;
begin
ReadLn(m, n);
if m > n then k := m else k := n;
for i := 1 to k do
for j := 1 to k do c[i, j] := maxC;
while not SeekEof do ReadLn(i, j, c[i, j]);
end;
procedure Init;
{Khi to b ghp rng v hai dy i ngu Fx, Fy}
var
i, j: Integer;
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
L Minh Hong

L thuyt th

\ 108 [

end;
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
end;
function GetC(i, j: Integer): Integer;
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure InitBFS;
var
y: Integer;
begin

{Hm tr v trng s cnh (X[i], Y[j])}

{Th tc khi to trc khi tm cch ghp startX}

{Hng i ch gm mi mt nh Start cy pha khi to ch c 1 nh start}

first := 1; last := 1;
Queue[1] := start;
{Khi to cc Y_nh u cha thm Trace[y] = 0, y}

FillChar(Trace, SizeOf(Trace), 0);


{Khi to cc d[y]}

for y := 1 to k do
begin
d[y] := GetC(start, y);
arg[y] := start;
end;
finish := 0;
end;
procedure Push(v: Integer);
begin
Inc(last); Queue[last] := v;
end;

{d[y] l khong cch t y ti cy pha gc start}


{arg[y] l X_nh thuc cy pha to ra khong cch }

{y mt nh vX vo hng i}

function Pop: Integer;


{Rt mt X_nh khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[first]; Inc(first);
end;
procedure FindAugmentingPath;
{Th tc tm ng m}
var
i, j, w: Integer;
begin
repeat
i := Pop;
{Rt mt nh X[i] khi hng i}
for j := 1 to k do
{Qut nhng Y_nh cha thm}
if Trace[j] = 0 then
begin
w := GetC(i, j);
{xt cnh (X[i], Y[j])}
if w = 0 then
{Nu l 0_cnh}
begin
Trace[j] := i;
{Lu vt ng i}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ni kt thc ng m v thot}
begin
finish := j;
Exit;
end;
Push(matchY[j]);
{Nu j ghp th y tip matchY[j] vo hng i}
end;
if d[j] > w then {Cp nht li khong cch d[j] nu thy cnh (X[i], Y[j]) ngn hn khong cch ny}
begin
L Minh Hong

L thuyt th

\ 109 [
d[j] := w;
arg[j] := i;
end;

end;
until first > last;
end;
{Xoay cc trng s cnh}

procedure SubX_AddY;
var
Delta: Integer;
x, y: Integer;
begin
{Trc ht tnh = gi tr nh nht trng s cc d[y], vi yY cha thm (y khng thuc cy pha)}

Delta := maxC;
for y := 1 to k do
if (Trace[y] = 0) and (d[y] < Delta) then Delta := d[y];
{Tr trng s nhng cnh lin thuc vi startX i }

Fx[start] := Fx[start] + Delta;


for y := 1 to k do
{Xt cc nh yY}
if Trace[y] <> 0 then
{Nu y thuc cy pha}
begin
x := matchY[y];
{Th x = matchY[y] cng phi thuc cy pha}
Fy[y] := Fy[y] - Delta;
{Cng trng s nhng cnh lin thuc vi y ln }
Fx[x] := Fx[x] + Delta;
{Tr trng s nhng cnh lin thuc vi x i }
end
else
d[y] := d[y] - Delta; {Nu y cy pha th sau bc xoay, khong cch t y n cy pha s gim }
{Chun b tip tcBFS}

for y := 1 to k do
if (Trace[y] = 0) and (d[y] = 0) then {Thm lun nhng nh yY to vi cy pha mt 0_cnh}
begin
Trace[y] := arg[y];
{Lu vt ng i}
if matchY[y] = 0 then
{Nu y cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
finish := y;
Exit;
end;
Push(matchY[y]);
{Nu y ghp th y lun matchY[y] vo hng i ch loang tip}
end;
end;
procedure Enlarge;
{Ni rng b ghp bng ng m kt thc finish}
var
x
finish
x, next: Integer;
begin
next
repeat
x := Trace[finish];
... ...
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
start
until finish = 0;
end;
procedure Solve;
var
x, y: Integer;
begin
for x := 1 to k do
{Vi mi X_nh: }
begin
start := x;
{t ni khi u ng m}
InitBFS;
{Khi to cy pha}
repeat
L Minh Hong

finish
next
... ...

start

L thuyt th
FindAugmentingPath;
{Tm ng m}
if finish = 0 then SubX_AddY;
{Nu khng thy th xoay cc trng s cnh ...}
until finish <> 0;
{Cho ti khi tm ra ng m}
Enlarge;
{Ni rng b ghp bi ng m tm c}
end;
end;
procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do
{Vi mi X_nh, xt cp ghp tng ng}
begin
y := matchX[x];
if c[x, y] < maxC then
{Ch quan tm n nhng cp ghp c trng s < maxC}
begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;
begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.

L Minh Hong

\ 110 [

L thuyt th

\ 111 [

13. BI TON TM B GHP CC I TRN TH


I. CC KHI NIM
Xt th G = (V, E), mt b ghp trn th G l mt tp cc cnh i mt khng c nh chung.
Bi ton tm b ghp cc i trn th tng qut pht biu nh sau:
Cho mt th G, phi tm mt b ghp cc i trn G (b ghp c nhiu cnh nht).
Vi mt b ghp M ca th G, ta gi:
Nhng cnh thuc M c gi l cnh ghp hay cnh m
Nhng cnh khng thuc M c gi l cnh cha ghp hay cnh nht
Nhng nh u mt ca cc cnh m c gi l nh ghp, nhng nh cn li gi l
nh cha ghp
Mt ng i c bn (ng i khng c nh lp li) c gi l ng pha nu n bt u
bng mt cnh nht v tip theo l cc cnh m, nht nm ni tip xen k nhau.
Mt chu trnh c bn (chu trnh khng c nh trong lp li) c gi l mt Blossom nu n i
qua t nht 3 nh, bt u v kt thc bng cnh nht v dc trn chu trnh, cc cnh m, nht
nm ni tip xen k nhau. nh xut pht ca chu trnh (cng l nh kt thc) c gi l nh
c s (base) ca Blossom.
ng m l mt ng pha bt u mt nh cha ghp v kt thc mt nh cha ghp.
V d: Vi th G v b ghp M di y:

matched edge
unmatched edge

Hnh 24: th G v mt b ghp M

ng (8, 1, 2, 5, 6, 4) l mt ng pha
Chu trnh (2, 3, 4, 6, 5, 2) l mt Blossom
ng (8, 1, 2, 3, 4, 6, 5, 7) l mt ng m
ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) tuy c cc cnh m/nht xen k nhng khng phi ng pha
(v tt nhin khng phi ng m) v y khng phi l ng i c bn.
Ta d dng suy ra c cc tnh cht sau
ng m cng nh Blossom u l ng i di l vi s cnh nht nhiu hn s cnh m
ng 1 cnh.
Trong mi Blossom, nhng nh khng phi nh c s u l nh ghp v nh ghp vi
nh cng phi thuc Blossom.
V Blossom l mt chu trnh nn trong mi Blossom, nhng nh khng phi nh c s u tn
ti hai ng pha t nh c s i n n, mt ng kt thc bng cnh m v mt ng kt
thc bng cnh nht, hai ng pha ny c hnh thnh bng cch i dc theo chu trnh theo
hai hng ngc nhau. Nh v d trn, nh 4 c hai ng pha i nh c s 2 i ti: (2, 3, 4)
l ng pha kt thc bng cnh m v (2, 5, 6, 4) l ng pha kt thc bng cnh nht
L Minh Hong

L thuyt th

\ 112 [

II. THUT TON EDMONDS (1965)


C s ca thut ton l nh l (C.Berge): Mt b ghp M ca th G l cc i khi v ch khi
khng tn ti ng m i vi M.
Thut ton Edmonds:
M := ;
for ( nh u cha ghp) do
if <Tm ng m xut pht t u> then
<
Dc trn ng m:
Loi b nhng cnh m khi M;
Thm vo M nhng cnh nht;
>
Result: M l b ghp cc i trn G

iu kh nht trong thut ton Edmonds l phi xy dng thut ton tm ng m xut pht t
mt nh cha ghp. Thut ton c xy dng bng cch kt hp mt thut ton tm kim trn
th vi php chp Blossom.
Xt nhng ng pha xut pht t mt nh x cha ghp. Nhng nh c th n c t x bng
mt ng pha kt thc l cnh nht c gn nhn "nht", nhng nh c th n c t x bng
mt ng pha kt thc l cnh m c gn nhn "m".
Vi mt Blossom, ta nh ngha php chp (shrink) l php thay th cc nh trong Blossom bng
mt nh duy nht. Nhng cnh ni gia mt nh thuc Blossom ti mt nh v no khng
thuc Blossom c thay th bng cnh ni gia nh chp ny vi v v gi nguyn tnh m/nht.
D thy rng sau mi php chp, cc cnh m vn c m bo l b ghp trn th mi:
*

Shrink

Shrink

blossom

blossom

Hnh 25: Php chp Blossom

Thut ton tm ng m c th pht biu nh sau.


Trc ht nh xut pht x c gn nhn m.
Tip theo l thut ton tm kim trn th bt u t x, theo nguyn tc: t nh m ch c
php i tip theo cnh nht v t nh nht ch c i tip theo cnh m. Mi khi thm ti
mt nh, ta gn nhn m/nht cho nh v tip tc thao tc tm kim trn th nh bnh
thng. Cng trong qu trnh tm kim, mi khi pht hin thy mt cnh nht ni hai nh m,
ta dng li ngay v nu gn nhn tip s gp tnh trng mt nh c c hai nhn m/nht, trong
trng hp ny, Blossom c pht hin (xem tnh cht ca Blossom) v b chp thnh mt

L Minh Hong

L thuyt th

\ 113 [

nh, thut ton c bt u li vi th mi cho ti khi tr li c cu hi: "c tn ti


ng m xut pht t x hay khng?"
Nu ng m tm c khng i qua nh chp no th ta ch vic tng cp dc theo ng
m. Nu ng m c i qua mt nh chp th ta li n nh chp ra thnh Blossom thay
nh chp ny trn ng m bng mt on ng xuyn qua Blossom:
*

expand

expand

blossom

blossom

Hnh 26: N Blossom d ng xuyn qua Blossom

Lu rng khng phi Blossom no cng b chp, ch nhng Blossom nh hng ti qu trnh tm
ng m mi phi chp m bo rng ng m tm c l ng i c bn. Tuy nhin vic
ci t trc tip cc php chp Blossom v n nh kh rc ri, i hi mt chng trnh vi
phc tp O(n4).
Di y ta s trnh by mt phng php ci t hiu qu hn vi phc tp O(n3), phng php
ny ci t khng phc tp, nhng yu cu phi hiu rt r bn cht thut ton.
III. PHNG PHP LAWLER (1973)
Trong phng php Edmonds, sau khi chp mi Blossom thnh mt nh th nh hon ton li
c th nm trn mt Blossom mi v b chp tip. Phng php Lawler ch quan tm n nh chp
cui cng, i din cho Blossom ngoi nht (Outermost Blossom), nh chp cui cng ny c
nh danh (nh s) bng nh c s ca Blossom ngoi nht.
Cng chnh v thao tc chp/n ni trn m ta cn m rng khi nim Blossom, c th coi mt
Blossom l mt tp nh n ra t mt nh chp ch khng n thun ch l mt chu trnh pha
c bn na.
Xt mt Blossom B c nh c s l nh r. Vi vB, v r, ta lu li hai ng pha t r ti v,
mt ng kt thc bng cnh m v mt ng kt thc bng cnh nht, nh vy c hai loi vt
gn cho mi nh v:
S[v] l nh lin trc v trn ng pha kt thc bng cnh m, nu khng tn ti ng pha
loi ny th S[v] = 0.
T[v] l nh lin trc v trn ng pha kt thc bng cnh nht, nu khng tn ti ng pha
loi ny th T[v] = 0.
Bn cnh hai nhn S v T, mi nh v cn c thm
Nhn b[v] l nh c s ca Blossom cha v. Hai nh u v v thuc cng mt Blossom b[u]
= b[v].
Nhn match[v] l nh ghp vi nh v. Nu v cha ghp th match[v] = 0.
L Minh Hong

L thuyt th

\ 114 [

Khi thut ton tm ng m bt u t nh x cha ghp c th pht biu nh sau:


Bc 1: (Init)
Hng i Queue dng cha nhng nh m ch duyt, ban u ch gm mt nh m x.
Vi mi nh u, khi gn b[u] = u v match[u] = 0 vi u.
Gn S[x] 0; Vi ux, gn S[u] = 0;Vi v: gn T[v] = 0
Bc 2: (BFS)
Lp li cc bc sau cho ti khi hng i rng:
Vi mi nh m u ly ra t Queue, xt nhng cnh nht (u, v):
Nu v cha thm:
Nu v l nh cha ghp Tm thy ng m kt thc v, dng
Nu v l nh ghp thm v thm lun match[v] v y match[v] vo Queue.
Sau mi ln thm, ch vic lu vt (hai nhn S v T)
Nu v thm
Nu v l nh nht hoc b[v] = b[u] b qua
Nu v l nh m v b[v] b[u] ta pht hin c blossom mi cha u v v, khi :
Pht hin nh c s: Truy vt ng i ngc t hai nh m u v v theo hai ng pha
v nt gc, chn ly nh a l nh m chung gp u tin trong qu trnh truy vt ngc.
Khi Blossom mi pht hin s c nh c s l a.
Gn li vt: Gi (a = i1, i2, ..., ip = u) v (a = j1, j2, ..., jq = v) ln lt l hai ng pha dn
t a ti u v v. Khi (a = i1, i2, ..., ip = u, jq = v, jq-1, ..., j1 = a) l mt chu trnh pha i t a
ti u v v ri quay tr v a. Bng cch i dc theo chu trnh ny theo hai hng ngc
nhau, ta c th gn li tt c cc nhn S v T ca nhng nh trn chu trnh. Lu rng
khng c gn li nhn S v T cho nhng nh k m b[k] = a, v vi nhng nh k c
b[k] a th bt buc phi gn li nhn S v T theo chu trnh ny bt k S[k] v T[k]
trc c hay cha.
Chp Blossom: Xt nhng nh v m b[v]{b[i1], b[i2], ..., b[ip], b[j1], b[j2], ..., b[jq]}, gn
li b[v] = a. Nu v l nh m (c nhn S[v] 0) m cha c duyt ti (cha bao gi
c y vo Queue) th y v vo Queue ch duyt tip ti nhng bc sau.
Nu qu trnh ny ch thot khi hng i rng th tc l khng tn ti ng m bt u t x.
Sau y l mt s v d v cc trng hp t nh m u xt cnh nht (u, v):
Trng hp 1: v cha thm v cha ghp:
S:2
u=3

v=4

T:1

L Minh Hong

T:3

u=3

v=4

2
T:1

Tm thy ng m

Trng hp 2: v cha thm v ghp

S:2

L thuyt th

\ 115 [
S:2
u=3

v=4

S:2

T:3

S:4

u=3

v=4

T:1

T:1

Thm c v ln match[v], gn nhn T[v] v S[match[v]]

Trng hp 3: v thm, l nh m thuc cng blossom vi u

T:1

S:2

T:3
S:5

T:7
S:4

u=4

v=7

T:3
S:7

T:5
S:6

b=3

Khng xt, b qua

Trng hp 4: v thm, l nh m v b[u] b[v]


T:3

S:4

T:3
S:5

T:7
S:4

u=5

u=5

a
x

T:1

S:2

T:1

S:2

v=7

v=7

T:3

S:6

T:3
S:7

T:5
S:6

b=3

Tm nh c s a = 3, gn li nhn S v T dc chu trnh pha, chp Blossom.


y hai nh m mi 4, 6 vo hng i, Ti nhng bc sau,
khi duyt ti nh 6, s tm thy ng m kt thc 8,
truy vt theo nhn S v T tm c ng (1, 2, 3, 4, 5, 7, 6, 8)

T tng chnh ca phng php Lawler l dng cc nhn b[v] thay cho thao tc chp trc tip
Blossom, dng cc nhn S v T truy vt tm ng m, trnh thao tc n Blossom. Phng php
ny da trn mt nhn xt: Mi khi tm ra ng m, nu ng m xuyn qua mt Blossom
ngoi nht th chc chn n phi i vo Blossom ny t nt c s v thot ra khi Blossom bng
mt cnh nht.
IV. CI T
Ta s ci t phng php Lawler vi khun dng Input/Output nh sau:
Input: file vn bn GMATCH.INP
Dng 1: Cha hai s n, m ln lt l s cnh v s nh ca th cch nhau t nht mt du
cch (n 100)
m dng tip theo, mi dng cha hai s u, v tng trng cho mt cnh (u, v) ca th
L Minh Hong

L thuyt th

\ 116 [

Output: file vn bn GMATCH.OUT cha b ghp cc i tm c


7

10

GMATCH.INP
10 11
1 2
1 6
2 4
2 8
3 4
3 6
5 6
5 9
5 10
7 8
7 9

GMATCH.OUT
1 6
2 8
3 4
5 10
7 9
Number of matched edges: 5

Chng trnh ny sa i mt cht m hnh ci t trn da vo nhn xt:


v l mt nh m v = x hoc match[v] l mt nh nht
Nu v l nh m th S[v] = match[v]
Vy th ta khng cn phi s dng ring mt mng nhn S[v], ti mi bc sa vt, ta ch cn sa
nhn vt T[v] m thi. kim tra mt nh v x c phi nh m hay khng, ta c th kim tra
bng iu kin: match[v] c l nh nht hay khng, hay T[match[v]] c khc 0 hay khng.
Chng trnh s dng cc bin vi vai tr nh sau:
match[v] l nh ghp vi nh v
b[v] l nh c s ca Blossom cha v
T[v] l nh lin trc v trn ng pha t nh xut pht ti v kt thc bng cnh nht, T[v] =
0 nu qu trnh BFS cha xt ti nh nht v.
InQueue[v] l bin Boolean, InQueue[v] = True v l nh m c y vo Queue
ch duyt.
start v finish: Ni bt u v kt thc ng m.
PROG13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds
program MatchingInGeneralGraph;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
match, Queue, b, T: array[1..max] of Integer;
InQueue: array[1..max] of Boolean;
n, first, last, start, finish: Integer;
procedure Enter;
{Nhp d liu, t thit b nhp chun (Input)}
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
L Minh Hong

{Khi to b ghp rng}

L thuyt th

\ 117 [

begin
FillChar(match, SizeOf(match), 0);
end;
procedure InitBFS; {Th tc ny c gi khi to trc khi tm ng m xut pht t start}
var
i: Integer;
begin
{Hng i ch gm mt nh m start}

first := 1; last := 1;
Queue[1] := start;
FillChar(InQueue, SizeOf(InQueue), False);
InQueue[start] := True;
{Cc nhn T c khi gn = 0}

FillChar(T, SizeOF(T), 0);


{Nt c s ca outermost blossom cha i chnh l i}

for i := 1 to n do b[i] := i;
finish := 0; {finish = 0 ngha l cha tm thy ng m}
end;
procedure Push(v: Integer);
begin
Inc(last);
Queue[last] := v;
InQueue[v] := True;
end;

{y mt nh m v vo hng i}

function Pop: Integer;


begin
Pop := Queue[first];
Inc(first);
end;

{Ly mt nh m khi hng i, tr v trong kt qu hm}

{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht nt hai nh m p, q}

procedure BlossomShrink(p, q: Integer);


var
i, NewBase: Integer;
Mark: array[1..max] of Boolean;
{Th tc tm nt c s bng cch truy vt ngc theo ng pha t p v q}

function FindCommonAncestor(p, q: Integer): Integer;


var
InPath: array[1..max] of Boolean;
begin
FillChar(InPath, SizeOf(Inpath), False);
repeat
{Truy vt t p}
p := b[p];
{Nhy ti nt c s ca Blossom cha p, php nhy ny tng tc truy vt}
Inpath[p] := True;
{nh du nt }
if p = start then Break; {Nu truy v n ni xut pht th dng}
p := T[match[p]];
{Nu cha v n start th truy li tip hai bc, theo cnh m ri theo cnh nht}
until False;
repeat
{Truy vt t q, tng t nh i vi p}
q := b[q];
if InPath[q] then Break; {Tuy nhin nu chm vo ng pha ca p th dng ngay}
q := T[match[q]];
until False;
FindCommonAncestor := q;
{Ghi nhn nh c s mi}
end;
procedure ResetTrace(x: Integer); {Gn li nhn vt dc trn ng pha t start ti x}
var
u, v: Integer;
begin
v := x;
L Minh Hong

L thuyt th

\ 118 [

while b[v] <> NewBase do


{Truy vt ng pha t start ti nh m x}
begin
u := match[v];
Mark[b[v]] := True;
{nh du nhn blossom ca cc nh trn ng i}
Mark[b[u]] := True;
v := T[u];
if b[v] <> NewBase then T[v] := u; {Ch t li vt T[v] nu b[v] khng phi nt c s mi}
end;
end;
begin
{BlossomShrink}
FillChar(Mark, SizeOf(Mark), False);
NewBase := FindCommonAncestor(p, q);

{Tt c cc nhn b[v] u cha b nh du}


{xc nh nt c s}

{Gn li nhn}

ResetTrace(p); ResetTrace(q);
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[i] nu blossom b[i] b nh du}

for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;
{Xt nhng nh m i cha c a vo Queue nm trong Blossom mi, y i v Queue ch duyt tip ti cc bc sau}

for i := 1 to n do
if not InQueue[i] and (b[i] = NewBase) then
Push(i);
end;
{Th tc tm ng m}

procedure FindAugmentingPath;
var
u, v: Integer;
begin
InitBFS; {Khi to}
repeat
{BFS}
u := Pop;
{Xt nhng nh v cha duyt, k vi u, khng nm cng Blossom vi u, d nhin T[v] = 0 th (u, v) l cnh nht ri}

for v := 1 to n do
if (T[v] = 0) and (a[u, v]) and (b[u] <> b[v]) then
begin
if match[v] = 0 then
{Nu v cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
T[v] := u;
finish := v;
Exit;
end;
{Nu v l nh m th gn li vt, chp Blossom ...}

if (v = start) or (T[match[v]] <> 0) then


BlossomShrink(u, v)
else
{Nu khng th ghi vt ng i, thm v, thm lun c match[v] v y tip match[v] vo Queue}
begin
T[v] := u;
Push(match[v]);
end;
end;
until first > last;
end;
procedure Enlarge;
{Ni rng b ghp bi ng m bt u t start, kt thc finish}
var
v, next: Integer;
begin
repeat
v := T[finish];
next := match[v];
match[v] := finish;
L Minh Hong

L thuyt th

\ 119 [

match[finish] := v;
finish := next;
until finish = 0;
end;
procedure Solve;
{Thut ton Edmonds}
var
u: Integer;
begin
for u := 1 to n do
if match[u] = 0 then
begin
start := u;
{Vi mi nh cha ghp start}
FindAugmentingPath; {Tm ng m bt u t start}
if finish <> 0 then Enlarge; {Nu thy th ni rng b ghp theo ng m ny}
end;
end;
procedure Result;
{In b ghp tm c}
var
u, count: Integer;
begin
count := 0;
for u := 1 to n do
if match[u] > u then {Va trnh s trng lp (u, v) v (v, u), va loi nhng nh khng ghp c (match=0)}
begin
Inc(count);
WriteLn(u, ' ', match[u]);
end;
WriteLn('Number of matched edges: ', count);
end;
begin
Assign(Input, 'GMATCH.INP'); Reset(Input);
Assign(Output, 'GMATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.

V. PHC TP TNH TON

Th tc BlossomShrink c phc tp O(n).


Th tc FindAugmentingPath cn khng qu n ln gi th tc BlossomShrink, cng thm chi
ph ca thut ton tm kim theo chiu rng, c phc tp O(n2)
Phng php Lawler cn khng qu n ln gi th tc FindAugmentingPath nn c phc tp
tnh ton l O(n3)

L Minh Hong

You might also like