You are on page 1of 120

L thuyt th

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

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

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

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 Hnh 1: V d v m hnh th

Mng my tnh

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 n th

C hng

V hng a th

C hng

Hnh 2: Phn loi th

L Minh Hong

L thuyt th

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:
vV

deg(v) = 2m

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:
vV

deg

( 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

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 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 2

1 2 3 4 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

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 2

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 3 2 4 3 5 4 1 5 nil 2

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
1 5 4 3 2

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 2 3 4 5 6 7 8 9 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] List[5] 2 1 1 3 1 3 3 2 5 4 Nil Nil Nil 4 Nil 5 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 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 3 2 3

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 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

11

4 6

7 8 3 5

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 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}

12

{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

13

c)

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)).
2nd 2 4 6 1 7 8 3 5 3 3rd 5 4th 1st 1 7 8 2 5th 4 6 6th

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
{Dy chuyn duyt su ang l S ... u}

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

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.
2 1 7 4 6

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) u 1 2 3 5 3 2 4 6 4 2 1 v 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

x2

...

xp

u1

u2

...

uq

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 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.

18

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

8 5

Hng i (1) (2, 3) (3, 4) (4, 5) (5, 6) (6)

nh u (ly ra t hng i) 1 2 3 4 5 6

Hng i (sau khi ly u ra) (3) (4) (5) (6)

Cc nh v k u m cha ln lch 2, 3 4 5 6 Khng c Khng c

Hng i sau khi y nhng nh v vo (2, 3) (3, 4) (4, 5) (5, 6) (6)

L Minh Hong

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:
2 1 4 6 2 1 3 5 4 6 1 4 6

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 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;

20

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 1 v

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
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,

1 3 2 5 4 9 6 7 12

10

11

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 end; begin Assign(Input, 'GRAPH.INP'); Reset(Input); Assign(Output, 'GRAPH.OUT'); Rewrite(Output); Enter;
{Thut ton Warshall}

26

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

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 5th 2nd v
2nd 1st 5th u

1.

1st 5th 2nd

3rd u 4th

6th 7th

3rd

6th

v 7th

3rd v

6th 7th

4th

4th

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

TH2: v l hu du ca u (u, v) l cung xui Hnh 11: Ba dng cung ngoi cy DFS

TH3: v nm nhnh DFS duyt trc u (u, v l cung cho)

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:
a ... b ... ... ... ... ... ... b ... ... a ... 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 1

2 8 3 4 5 9 10 5 3

2 8

4 9 10

6 11 7

6 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 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 := >;

31

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 5 9 10

6 11 7

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; function Pop: Integer; begin Pop := Stack[Last]; Dec(Last); end;

{y mt nh v vo ngn xp}

{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

4 5 8 6 9 10

5 4 3 7 2 1 11 7 9 8 10

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 S 1 S

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 1

2 3

2 3

7 8

7 8

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 2 1 3 1 1

2 3
4

3 8 9 10 3

5
4 5 3

7 8

7 5

10

th v hng

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
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

1 3 4

8 9

10

11

PROG05_1.PAS * Php nh chiu DFS v lit k cu program Directivity_and_Bridges; L Minh Hong

L thuyt th 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;

43

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 end; begin Enter; Init; Solve; end.

44

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 5 13

7 8

14

17

10

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 4 3 8 6 7 11 12 13 10 9 5

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 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]}

46

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 6. CHU TRNH EULER, NG I EULER, TH EULER

47

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 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:
2 5 7 1 4 8 3 6 3 6 1 4 8 2 5 7

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 EULER.INP 4 1 2 1 1 3 2 1 4 1 2 3 1 3 4 1 EULER.OUT 1 2

49

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 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.

50

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 <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;

51

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; function Get: Integer; begin Get := Stack[last]; end; procedure FindEulerCircuit; var
{Ly mt nh khi ngn xp, tr v trong kt qu hm}

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

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.
B 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 a c a b a b g

e G1

d G2

c 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. 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

2.

3.

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
HAMILTON.INP 5 6 1 2 1 3 2 4 3 5 4 1 5 2 HAMILTON.OUT 1 3 5 2 4 1 1 4 2 5 3 1

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;

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 begin
{nh hng thit b nhp/xut chun}

55

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 Vi n = 8; 42 3 17 44 46 1 31 48 60 37 15 64 56 13 29 62 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 8 21 6 51 10 23 26 53

18 97 72 41 16 79 36 39 14 11

71 42 17 96 83 40 15 12 33 38

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

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.
... S F1 F2 F

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 1 20 6 4 5 2 3 5 2 3 20 4

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); for u := 1 for v := if u = for i := 1 end;
{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 +}

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]);


{Khi to}

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;

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

{Thut ton Ford-Bellman}

L Minh Hong

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 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}

62

{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 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}

64

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 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.

65

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
1 4 7 5 6 3 2 1 5 4 6 2

66

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; end; begin Assign(Input, 'MINPATH.INP'); Reset(Input); Assign(Output, 'MINPATH.OUT'); Rewrite(Output); LoadGraph; Floyd; PrintResult; Close(Input); Close(Output); end.

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

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 4 2 3 2 4

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
1 1 1 1 2 3 6 2 1 5 1 2 1 4

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 r2 u v u v r1 r2

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
{Ly gc ca cy cha v}

function GetRoot(v: Integer): Integer; begin while Lab[v] > 0 do v := Lab[v]; GetRoot := v; end; 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; 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.
{Hp nht hai cy thnh mt cy}

76

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:
u ( v )

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


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 5 1 3 5 6 3 1 5 2 3 1 6 3 6 1 0 1 5 4 6 2 5 5 1 6 4 6

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 2 5;5 3;0 1 6;1 3 1;1 5 2 3;1 6 1 1 3 1 5 5 1 4 6;6 5 3 2 2 6 1 4 6

5,2

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.
2 5;5 3;0 1 5,2 3 1;1 5 6;1 6;5 4 2 6;6 5;5 3;2 6 1 5,4 3 1;1 5 6;3 6;3 4 6;6

3;1

3;3 6

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
2 5 1 5 6 3 1 5 3 6 3 6 4 6

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 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;

83

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
{Th tc tng lung dc theo ng tng lung tm c trong FindPath}

84

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 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.

87

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

90

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

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
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] -

2 5

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

4 X

4 Y

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 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}

92

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}

f next ... ...

f next ... ...

L thuyt th 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.

93

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: 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 -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
Y1

X1

x* = X1 Tm c ng m:

X1

Y1

X2 2 1 X3

Y2

X1 Y1 Tng cp

X2 2 1

Y2

Y3

X3

Y3

X4

Y4

X4

Y4

X1

Y1

x* = X2 Tm c ng m:

X1

Y1

X2 2 1 X3

Y2

X2 Y1 X1 Y2 Tng cp

X2 2 1

Y2

Y3

X3

Y3

X4

Y4

X4

Y4

X1

Y1

x* = X3 Tm c ng m:

X1

Y1

X2 2 1 X3

Y2

X3 Y3 Tng cp

X2 2 1

Y2

Y3

X3

Y3

X4

Y4

X4

Y4

X1

Y1

X2 2 1= X3

Y2

Y3

X4

Y4

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

Y1

X2 2 0 X3

Y2

Y3

X4

Y4

L Minh Hong

L thuyt th

99
Y1

X1

X2 2=

Y2

X3

Y3

X4

Y4

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

X1

Y1

X2 0

Y2

X3

Y3

X4

Y4

X1

Y1

x* = X4 Tm c ng m:

X1

Y1

X2 0

Y2

X4 Y3 X3 Y2 X1 Y1 X2 Y4 Tng cp Xong

X2

Y2

X3

Y3

X3

Y3

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
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

2 2 3

2 1 3

Y 6

0 2 1 0

9 19

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
{B ghp rng} {Khi to}

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 end;
{Hm cho bit trng s cnh (X[i], Y[j]) }

103

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 end;
{Ni rng b ghp bi ng m tm c}

104

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 next ... ...

finish 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; begin Assign(Input, 'ASSIGN.INP'); Reset(Input); Assign(Output, 'ASSIGN.OUT'); Rewrite(Output); Enter; Init; Solve; Result; Close(Input); Close(Output); end.

', c[x, y]);

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

105

2. 3.

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 +

+ y2

y1

y2

x1

x2

x1

x2

y3

y4 +

y5 +

y7

y3

y4

y5

y7

x3 - y6

X4 -

X5 -

X7

x3

X4

X5

X7

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 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])}

108

{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 d[j] := w; arg[j] := i; end; end; until first > last; end;
{Xoay cc trng s cnh}

109

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.

110

L Minh Hong

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:
3 4

2 matched edge unmatched edge 7

5 9

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 S:2 u=3 T:3 v=4

2 T:1

2 T:1

Tm thy ng m

Trng hp 2: v cha thm v ghp

L Minh Hong

L thuyt th
S:2 u=3 v=4 5 S:2 u=3 T:3 v=4 S:4 5

115

2 T:1

2 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:3 S:5 u=4 x T:7 S:4 5

2 T:1

3 S:2 6 T:3 S:7 b=3 v=7 T:5 S:6

Khng xt, b qua

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


T:3 4 x S:4 u=5 a 1 2 T:1 3 S:2 6 8 T:3 v=7 S:6 8 x 1 2 T:1 3 S:2 6 T:3 S:7 b=3 v=7 T:5 S:6 T:3 S:5 4 T:7 S:4 u=5

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 8

6 3 4

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 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}

117

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; function Pop: Integer; begin Pop := Queue[first]; Inc(first); end;
{y mt nh m v vo hng i}

{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);
{Gn li nhn} {Tt c cc nhn b[v] u cha b nh du} {xc nh nt c s}

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 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;

119

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