Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 316 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
316
Dung lượng
12,66 MB
Nội dung
LÊ MINH HOÀNG Bài gi ng chuyên đ i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt CuuDuongThanCong.com https://fb.com/tailieudientucntt L ic m n Tôi mu n bày t lòng bi t n đ i v i nh ng ng đ y khó kh n tơi m i b i th y ch d y t n tình nh ng n m tháng c vào h c tin h c l p trình S hi u bi t lòng nhi t tình c a th y không nh ng cung c p cho nh ng ki n th c quý báu mà t m g noi theo đ ng b c gi ng c ng v i t cách m t ng Cu n tài li u đ c vi t d a nh ng tài li u thu th p đ ng sáng cho i th y c t nhi u ngu n khác nhau, b i công s c c a nhi u th h th y trò t ng gi ng d y h c t p t i Kh i Ph thơng chun TốnTin, i h c S ph m Hà N i, tơi ch ng i t ng h p l i Qua đây, mu n g i l i c m n t i đ ng nghi p đ c đóng góp nh ng ý ki n quí báu, c m n b n h c sinh - nh ng ng i tr c ti p làm nên cu n sách Do th i gian h n h p, m t s chuyên đ có nh ng ch a k p ch nh s a đ a vào tài li u B n đ c có th tham kh o thêm ph n tra c u R t mong nh n đ c nh ng l i nh n xét góp ý c a b n đ hoàn thi n cu n sách Tokyo, 28 tháng n m 2003 Lê Minh Hoàng CuuDuongThanCong.com https://fb.com/tailieudientucntt CuuDuongThanCong.com https://fb.com/tailieudientucntt i M CL C PH N BÀI TOÁN LI T KÊ §1 NH C L I M T S KI N TH C IS T H P 1.1 CH NH H P L P 1.2 CH NH H P KHÔNG L P .2 1.3 HOÁN V 1.4 T H P §2 PH NG PHÁP SINH (GENERATION) 2.1 SINH CÁC DÃY NH PHÂN DÀI N 2.2 LI T KÊ CÁC T P CON K PH N T 2.3 LI T KÊ CÁC HOÁN V §3 THU T TỐN QUAY LUI 12 3.1 LI T KÊ CÁC DÃY NH PHÂN DÀI N 12 3.2 LI T KÊ CÁC T P CON K PH N T 13 3.3 LI T KÊ CÁC CH NH H P KHÔNG L P CH P K 15 3.4 BÀI TỐN PHÂN TÍCH S 16 3.5 BÀI TOÁN X P H U .18 §4 K THU T NHÁNH C N .24 4.1 BÀI TOÁN T I 4.2 S U .24 BÙNG N T H P 24 4.3 MƠ HÌNH K THU T NHÁNH C N 24 4.4 BÀI TOÁN NG I DU L CH 25 4.5 DÃY ABC 28 PH N C U TRÚC D §1 CÁC B 1.1 XÁC CC LI U VÀ GI I THU T 33 B N KHI TI N HÀNH GI I CÁC BÀI TOÁN TIN H C .34 NH BÀI TOÁN 34 1.2 TÌM C U TRÚC D LI U BI U DI N BÀI TOÁN 34 1.3 TÌM THU T TOÁN 35 1.4 L P TRÌNH .37 1.5 KI M TH 37 1.6 T I U CH NG TRÌNH .38 §2 PHÂN TÍCH TH I GIAN TH C HI N GI I THU T 40 2.1 PH C T P TÍNH TỐN C A GI I THU T 40 2.2 XÁC 2.3 NH PH C T P TÍNH TỐN C A GI I THU T 40 PH C T P TÍNH TỐN V I TÌNH TR NG D LI U VÀO 43 2.4 CHI PHÍ TH C HI N THU T TOÁN 43 CuuDuongThanCong.com https://fb.com/tailieudientucntt ii §3 QUY VÀ GI I THU T 3.1 KHÁI NI M V QUY 45 QUY 45 3.2 GI I THU T QUY 45 3.3 VÍ D V GI I THU T 3.4 HI U L C C A §4 C U TRÚC D QUY 46 QUY 50 LI U BI U DI N DANH SÁCH 52 4.1 KHÁI NI M DANH SÁCH 52 4.2 BI U DI N DANH SÁCH TRONG MÁY TÍNH 52 §5 NG N X P VÀ HÀNG I 58 5.1 NG N X P (STACK) 58 5.2 HÀNG I (QUEUE) 60 §6 CÂY (TREE) 64 6.1 NH NGH A 64 6.2 CÂY NH PHÂN (BINARY TREE) 65 6.3 BI U DI N CÂY NH PHÂN 67 6.4 PHÉP DUY T CÂY NH PHÂN 69 6.5 CÂY K_PHÂN 70 6.6 CÂY T NG QUÁT 71 §7 KÝ PHÁP TI N T , TRUNG T 7.1 BI U TH C D VÀ H U T 74 I D NG CÂY NH PHÂN 74 7.2 CÁC KÝ PHÁP CHO CÙNG M T BI U TH C 74 7.3 CÁCH TÍNH GIÁ TR BI U TH C 75 7.4 CHUY N T D NG TRUNG T SANG D NG H U T 78 7.5 XÂY D NG CÂY NH PHÂN BI U DI N BI U TH C 80 §8 S P X P (SORTING) 82 8.1 BÀI TOÁN S P X P 82 8.2 THU T TOÁN S P X P KI U CH N (SELECTIONSORT) 84 8.3 THU T TOÁN S P X P N I B T (BUBBLESORT) 85 8.4 THU T TOÁN S P X P KI U CHÈN 85 8.5 SHELLSORT 87 8.6 THU T TOÁN S P X P KI U PHÂN O N (QUICKSORT) 88 8.7 THU T TOÁN S P X P KI U VUN 8.8 S P X P B NG PHÉP 8.9 TÍNH N NG (HEAPSORT) 92 M PHÂN PH I (DISTRIBUTION COUNTING) 95 NH C A THU T TOÁN S P X P (STABILITY) 96 8.10 THU T TOÁN S P X P B NG C S (RADIXSORT) 97 8.11 THU T TOÁN S P X P TR N (MERGESORT) 102 8.12 CÀI T 105 8.13 ÁNH GIÁ, NH N XÉT 112 §9 TÌM KI M (SEARCHING) 116 CuuDuongThanCong.com https://fb.com/tailieudientucntt iii 9.1 BÀI TỐN TÌM KI M 116 9.2 TÌM KI M TU N T (SEQUENTIAL SEARCH) 116 9.3 TÌM KI M NH PHÂN (BINARY SEARCH) 116 9.4 CÂY NH PHÂN TÌM KI M (BINARY SEARCH TREE - BST) .117 9.5 PHÉP B M (HASH) 122 9.6 KHOÁ S V I BÀI TỐN TÌM KI M .122 9.7 CÂY TÌM KI M S H C (DIGITAL SEARCH TREE - DST) 123 9.8 CÂY TÌM KI M C S (RADIX SEARCH TREE - RST) 126 9.9 NH NG NH N XÉT CU I CÙNG .131 PH N QUY HO CH NG 133 §1 CƠNG TH C TRUY H I 134 1.1 VÍ D .134 1.2 C I TI N TH NH T 135 1.3 C I TI N TH HAI 137 1.4 CÀI §2 PH T QUY 137 NG PHÁP QUY HO CH NG 139 2.1 BÀI TOÁN QUY HO CH 139 2.2 PH §3 M T S NG PHÁP QUY HO CH NG .139 BÀI TOÁN QUY HO CH 3.1 DÃY CON NG 143 N I U T NG DÀI NH T 143 3.2 BÀI TOÁN CÁI TÚI 148 3.3 BI N I XÂU .150 3.4 DÃY CON CÓ T NG CHIA H T CHO K 154 3.5 PHÉP NHÂN T H P DÃY MA TR N 159 3.6 BÀI T P LUY N T P 163 PH N CÁC THU T TOÁN TRÊN §1 CÁC KHÁI NI M C 1.1 NH NGH A TH 169 B N .170 TH (GRAPH) .170 1.2 CÁC KHÁI NI M 171 §2 BI U DI N TH TRÊN MÁY TÍNH 173 2.1 MA TR N LI N K (MA TR N K ) 173 2.2 DANH SÁCH C NH 174 2.3 DANH SÁCH K 175 2.4 NH N XÉT 176 §3 CÁC THU T TỐN TÌM KI M TRÊN TH 177 3.1 BÀI TOÁN .177 3.2 THU T TỐN TÌM KI M THEO CHI U SÂU (DEPTH FIRST SEARCH) 178 3.3 THU T TỐN TÌM KI M THEO CHI U R NG (BREADTH FIRST SEARCH) 184 CuuDuongThanCong.com https://fb.com/tailieudientucntt iv 3.4 PH C T P TÍNH TỐN C A BFS VÀ DFS 189 §4 TÍNH LIÊN THƠNG C A 4.1 TH 190 NH NGH A 190 4.2 TÍNH LIÊN THÔNG TRONG 4.3 TH Y TH VÔ H NG 191 VÀ THU T TOÁN WARSHALL 191 4.4 CÁC THÀNH PH N LIÊN THÔNG M NH 195 §5 VÀI NG D NG C A CÁC THU T TỐN TÌM KI M TRÊN 5.1 XÂY D NG CÂY KHUNG C A TH 205 5.2 T P CÁC CHU TRÌNH C B N C A 5.3 NH CHI U TH 205 TH 208 TH VÀ BÀI TOÁN LI T KÊ C U 208 5.4 LI T KÊ KH P 214 §6 CHU TRÌNH EULER, NG I EULER, TH EULER 218 6.1 BÀI TOÁN CÁI C U 218 6.2 NH NGH A 218 6.3 NH LÝ 218 6.4 THU T TỐN FLEURY TÌM CHU TRÌNH EULER 219 6.5 CÀI T 220 6.6 THU T TOÁN T T H N 222 §7 CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 225 7.1 NH NGH A 225 7.2 NH LÝ 225 7.3 CÀI T 226 §8 BÀI TỐN 8.1 NG I NG N NH T 230 TH CÓ TR NG S 230 8.2 BÀI TOÁN NG I NG N NH T 230 8.3 TR NG H P TH KHƠNG CĨ CHU TRÌNH ÂM - THU T TOÁN FORD BELLMAN 232 8.4 TR NG H P TR NG S TRÊN CÁC CUNG KHƠNG ÂM - THU T TỐN DIJKSTRA 234 8.5 THU T TOÁN DIJKSTRA VÀ C U TRÚC HEAP 237 8.6 TR 8.7 NG H P TH KHƠNG CĨ CHU TRÌNH - TH NG I NG N NH T GI A M I C P T TÔ PÔ 240 NH - THU T TOÁN FLOYD 242 8.8 NH N XÉT 245 §9 BÀI TỐN CÂY KHUNG NH NH T 247 9.1 BÀI TOÁN CÂY KHUNG NH NH T 247 9.2 THU T TOÁN KRUSKAL (JOSEPH KRUSKAL - 1956) 247 9.3 THU T TOÁN PRIM (ROBERT PRIM - 1957) 252 §10 BÀI TOÁN LU NG C C I TRÊN M NG 256 10.1 BÀI TOÁN 256 10.2 LÁT C T, 10.3 CÀI NG T NG LU NG, NH LÝ FORD - FULKERSON 256 T 258 CuuDuongThanCong.com https://fb.com/tailieudientucntt v 10.4 THU T TOÁN FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) 262 §11 BÀI TỐN TÌM B 11.1 GHÉP C C I TRÊN TH HAI PHÍA 266 TH HAI PHÍA (BIPARTITE GRAPH) 266 11.2 BÀI TỐN GHÉP ƠI KHƠNG TR NG VÀ CÁC KHÁI NI M 266 11.3 THU T TOÁN 11.4 CÀI NG M 267 T 268 §12 BÀI TỐN TÌM B GHÉP C C I V I TR NG S C C TI U TRÊN TH HAI PHÍA - THU T TOÁN HUNGARI .273 12.1 BÀI TOÁN PHÂN CÔNG 273 12.2 PHÂN TÍCH .273 12.3 THU T TOÁN 274 12.4 CÀI T 278 12.5 BÀI TỐN TÌM B GHÉP C C I V I TR NG S C C I TRÊN TH HAI PHÍA .284 12.6 NÂNG C P 284 §13 BÀI TỐN TÌM B GHÉP C C I TRÊN TH 290 13.1 CÁC KHÁI NI M 290 13.2 THU T TOÁN EDMONDS (1965) 291 13.3 PH NG PHÁP LAWLER (1973) .293 13.4 CÀI 13.5 T 295 PH C T P TÍNH TỐN .299 TÀI LI U C THÊM 301 CuuDuongThanCong.com https://fb.com/tailieudientucntt vi HÌNH V Hình 1: Cây tìm ki m quay lui toán li t kê dãy nh phân 13 Hình 2: X p quân h u bàn c 8x8 19 ng chéo B-TN mang ch s 10 đ Hình 3: ng chéo N-TB mang ch s 19 Hình 4: L u đ thu t gi i (Flowchart) 36 Hình 5: Tháp Hà N i 49 Hình 6: C u trúc nút c a danh sách n i đ n 53 Hình 7: Danh sách n i đ n 53 Hình 8: C u trúc nút c a danh sách n i kép 55 Hình 9: Danh sách n i kép 55 Hình 10: Danh sách n i vòng m t h ng 55 Hình 11: Danh sách n i vòng hai h ng 56 Hình 12: Dùng danh sách vòng mô t Queue 61 Hình 13: Di chuy n toa tàu 63 Hình 14: Di chuy n toa tàu (2) 63 Hình 15: Cây 64 Hình 16: M c c a nút 65 Hình 17: Cây bi u di n bi u th c 65 Hình 18: Các d ng nh phân suy bi n 66 Hình 19: Cây nh phân hồn ch nh nh phân đ y đ 66 Hình 20: ánh s nút c a nh phân đ y đ đ bi u di n b ng m ng 67 Hình 21: Nh c m c a ph ng pháp bi u di n b ng m ng 68 Hình 22: C u trúc nút c a nh phân 68 Hình 23: Bi u di n b ng c u trúc liên k t 69 Hình 24: ánh s nút c a 3_phân đ bi u di n b ng m ng 71 Hình 25: Bi u di n t ng quát b ng m ng 72 Hình 26: C u trúc nút c a t ng quát 73 Hình 27: Bi u th c d i d ng nh phân 74 Hình 28: Vòng l p c a QuickSort 89 Hình 29: Tr ng thái tr c g i đ quy 90 Hình 30: Heap 92 Hình 31: Vun đ ng 93 Hình 32: o giá tr k1 cho kn xét ph n l i 93 Hình 33: Vun ph n l i thành đ ng r i l i đ o tr k1 cho kn-1 94 Hình 34: ánh s bit 97 Hình 35: Thu t toán s p x p tr n 102 Hình 36: Cài đ t thu t toán s p x p v i d li u l n 114 Hình 37: Cây nh phân tìm ki m 118 Hình 38: Xóa nút BST 119 Hình 39 Xóa nút ch có m t nhánh BST 120 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chuyên đ 288 repeat i := Pop; {Rút m t đ nh X[i] kh i hàng đ i} for j := to k {Quét nh ng Y_đ nh ch a th m} if Trace[j] = then begin w := GetC(i, j); {xét c nh (X[i], Y[j])} if w = then {N u 0_c nh} begin Trace[j] := i; {L u v t đ ng đi} if matchY[j] = then {N u j ch a ghép ghi nh n n i k t thúc đ ng m thoát} begin finish := j; Exit; end; Push(matchY[j]); {N u j ghép đ y ti p matchY[j] vào hàng đ i} end; if d[j] > w then {C p nh t l i kho ng cách d[j] n u th y c nh (X[i], Y[j]) ng n h n kho ng cách này} begin d[j] := w; arg[j] := i; end; end; until first > last; end; {Xoay tr ng s c nh} procedure SubX_AddY; var Delta: Integer; x, y: Integer; begin {Tr c h t tính ∆ = giá tr nh nh t tr ng s d[y], v i y∈Y ch a th m (y không thu c pha)} Delta := maxC; for y := to k if (Trace[y] = 0) and (d[y] < Delta) then Delta := d[y]; {Tr tr ng s nh ng c nh liên thu c v i start∈X ∆} Fx[start] := Fx[start] + Delta; for y := to k {Xét đ nh y∈Y} if Trace[y] then {N u y thu c pha} begin x := matchY[y]; {Thì x = matchY[y] c ng ph i thu c pha} Fy[y] := Fy[y] - Delta; {C ng tr ng s nh ng c nh liên thu c v i y lên ∆} Fx[x] := Fx[x] + Delta; {Tr tr ng s nh ng c nh liên thu c v i x ∆} end else d[y] := d[y] - Delta; {N u y ∉ pha sau b c xoay, kho ng cách t y đ n pha s gi m ∆} {Chu n b ti p t cBFS} for y := to k if (Trace[y] = 0) and (d[y] = 0) then {Th m nh ng đ nh y∈Y t o v i pha m t 0_c nh} begin Trace[y] := arg[y]; {L u v t đ ng đi} if matchY[y] = then {N u y ch a ghép ghi nh n đ nh k t thúc đ ng m thoát ngay} begin finish := y; Exit; end; Push(matchY[y]); {N u y ghép đ y ln matchY[y] vào hàng đ i đ ch loang ti p} end; end; procedure Enlarge; {N i r ng b ghép b ng đ ng m k t thúc var x, next: Integer; finish} i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thu t toán đ th begin repeat x := Trace[finish]; next := matchX[x]; matchX[x] := finish; matchY[finish] := x; finish := Next; until finish = 0; end; 289 x f next start procedure Result; var x, y, Count, W: Integer; f: Text; begin Assign(f, OutputFile); Rewrite(f); WriteLn(f, 'Optimal assignment:'); W := 0; Count := 0; for x := to m {V i m i X_đ nh, xét c p ghép t ng ng} begin y := matchX[x]; if c[x, y] < maxC then {Ch quan tâm đ n nh ng c p ghép có tr ng s < maxC} begin Inc(Count); WriteLn(f, Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]); W := W + c[x, y]; end; end; WriteLn(f, 'Cost: ', W); Close(f); end; begin Enter; Init; Solve; Result; end Lê Minh Hoàng https://fb.com/tailieudientucntt f next start procedure Solve; var x, y: Integer; begin for x := to k {V i m i X_đ nh: } begin start := x; { t n i kh i đ u đ ng m } InitBFS; {Kh i t o pha} repeat FindAugmentingPath; {Tìm đ ng m } if finish = then SubX_AddY; {N u không th y xoay tr ng s c nh …} until finish 0; {Cho t i tìm đ ng m } Enlarge; {N i r ng b ghép b i đ ng m tìm đ c} end; end; CuuDuongThanCong.com x Chun đ 290 §13 BÀI TỐN TÌM B GHÉP C C I TRÊN TH 13.1 CÁC KHÁI NI M Xét đ th G = (V, E), m t b ghép đ th G m t t p c nh đơi m t khơng có đ nh chung Bài tốn tìm b ghép c c đ i đ th t ng quát phát bi u nh sau: Cho m t đ th G, ph i tìm m t b ghép c c đ i G (b ghép có nhi u c nh nh t) V i m t b ghép M c a đ th G, ta g i: Nh ng c nh thu c M đ c g i c nh ghép hay c nh đ m Nh ng c nh không thu c M đ c g i c nh ch a ghép hay c nh nh t c g i đ nh ghép, nh ng đ nh l i g i đ nh Nh ng đ nh đ u mút c a c nh đ m đ ch a ghép M tđ ng c b n (đ c g i đ ng khơng có đ nh l p l i) đ ng pha n u b t đ u b ng m t c nh nh t ti p theo c nh đ m, nh t n m n i ti p xen k M t chu trình c b n (chu trình khơng có đ nh l p l i) đ c g i m t Blossom n u qua nh t đ nh, b t đ u k t thúc b ng c nh nh t d c chu trình, c nh đ m, nh t n m n i ti p xen k nh xu t phát c a chu trình (c ng đ nh k t thúc) đ c g i đ nh c s (base) c a Blossom ng m m t đ ng pha b t đ u m t đ nh ch a ghép k t thúc m t đ nh ch a ghép Ví d : V i đ th G b ghép M Hình 87: ng (8, 1, 2, 5, 6, 4) m t đ ng pha Chu trình (2, 3, 4, 6, 5, 2) m t Blossom ng (8, 1, 2, 3, 4, 6, 5, 7) m t đ ng m ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) có c nh đ m/nh t xen k nh ng không ph i đ t t nhiên không ph i đ ng m ) khơng ph i đ ng pha (và ng c b n ã ghép Ch a ghép Hình 87: Ta d dàng suy đ th G m t b ghép M c tính ch t sau ng m c ng nh Blossom đ u đ ng đ dài l v i s c nh nh t nhi u h n s c nh đ m c nh i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thu t toán đ th 291 Trong m i Blossom, nh ng đ nh không ph i đ nh c s đ u đ nh ghép đ nh ghép v i đ nh c ng ph i thu c Blossom Vì Blossom m t chu trình nên m i Blossom, nh ng đ nh không ph i đ nh c s đ u t n t i hai đ ng pha t đ nh c s đ n nó, m t đ b ng c nh nh t, hai đ ng c Nh ví d ng pha đ ng k t thúc b ng c nh đ m m t đ ng k t thúc c hình thành b ng cách d c theo chu trình theo hai h Hình 87, đ nh có hai đ pha k t thúc b ng c nh đ m (2, 5, 6, 4) đ ng pha đ nh c s t i: (2, 3, 4) đ ng ng ng pha k t thúc b ng c nh nh t 13.2 THU T TOÁN EDMONDS (1965) C s c a thu t toán đ nh lý (C.Berge): M t b ghép M c a đ th G c c đ i ch không t n t i đ ng m đ i v i M Thu t toán Edmonds: M := ∅; for (∀ đ nh u ch a ghép) if then < D c đ ng m : Lo i b nh ng c nh đ m kh i M; Thêm vào M nh ng c nh nh t; > Result: M b ghép c c đ i G i u khó nh t thu t toán Edmonds ph i xây d ng thu t tốn tìm đ m t đ nh ch a ghép Thu t tốn đ ng m xu t phát t c xây d ng b ng cách k t h p m t thu t tốn tìm ki m đ th v i phép ch p Blossom Xét nh ng đ ng pha xu t phát t m t đ nh x ch a ghép Nh ng đ nh có th đ n đ m tđ ng pha k t thúc c nh nh t đ m tđ ng pha k t thúc c nh đ m đ c gán nhãn "nh t", nh ng đ nh có th đ n đ c t x b ng c t x b ng c gán nhãn "đ m" V i m t Blossom, ta đ nh ngh a phép ch p (shrink) phép thay th đ nh Blossom b ng m t đ nh nh t Nh ng c nh n i gi a m t đ nh thu c Blossom t i m t đ nh v khơng thu c Blossom đ c thay th b ng c nh n i gi a đ nh ch p v i v gi nguyên tính đ m/nh t D th y r ng sau m i phép ch p, c nh đ m v n đ c đ m b o b ghép đ th m i: Lê Minh Hoàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chuyên đ 292 Shrink Shrink Blossom Blossom = đ nh ch p t blossom = đ nh c s c a blossom Hình 88: Phép ch p Blossom Thu t tốn tìm đ Tr ng m có th phát bi u nh sau c h t đ nh xu t phát x đ c gán nhãn đ m Ti p theo thu t tốn tìm ki m đ th b t đ u t x, theo nguyên t c: t đ nh đ m ch đ phép ti p theo c nh nh t t đ nh nh t ch đ c c ti p theo c nh đ m M i th m t i m t đ nh, ta gán nhãn đ m/nh t cho đ nh ti p t c thao tác tìm ki m đ th nh bình th ng C ng trình tìm ki m, m i phát hi n th y m t c nh nh t n i hai đ nh đ m, ta d ng l i n u gán nhãn ti p s g p tình tr ng m t đ nh có c hai nhãn đ m/nh t, tr Blossom đ ng h p này, c phát hi n (xem tính ch t c a Blossom) b ch p thành m t đ nh, thu t toán đ b t đ u l i v i đ th m i cho t i tr l i đ c câu h i: "có t n t i đ c ng m xu t phát t x hay khơng?" N uđ ng m tìm đ N uđ ng m có qua m t đ nh ch p ta l i n đ nh ch p thành Blossom đ thay đ nh ch p đ c không qua đ nh ch p ta ch vi c t ng c p d c theo đ ng m b ng m t đo n đ ng m ng xuyên qua Blossom: Expand Hình 89: N Blossom đ dò đ Expand ng xuyên qua Blossom i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thu t toán đ th 293 L u ý r ng không ph i Blossom c ng b ch p, ch nh ng Blossom nh h đ ng m m i ph i ch p đ đ m b o r ng đ ng m tìm đ c đ ng t i trình tìm ng c b n Tuy nhiên vi c cài đ t tr c ti p phép ch p Blossom n đ nh r c r i, đòi h i m t ch ng trình v i đ ph c t p O(n4) D i ta s trình bày m t ph ng pháp cài đ t hi u qu h n v i đ ph c t p O(n3), ph ng pháp cài đ t không ph c t p, nh ng yêu c u ph i hi u r t rõ b n ch t thu t toán 13.3 PH Trong ph NG PHÁP LAWLER (1973) ng pháp Edmonds, sau ch p m i Blossom thành m t đ nh đ nh hồn tồn l i có th n m m t Blossom m i b ch p ti p Ph ng pháp Lawler ch quan tâm đ n đ nh ch p cu i cùng, đ i di n cho Blossom nh t (Outermost Blossom), đ nh ch p cu i đ c đ nh danh (đánh s ) b ng đ nh c s c a Blossom ngồi nh t C ng thao tác ch p/n nói mà ta c n m r ng khái ni m Blossom, có th coi m t Blossom m t t p đ nh n t m t đ nh ch p ch không đ n thu n ch m t chu trình pha c b n n a Xét m t Blossom B có đ nh c s đ nh r V i ∀v∈B, v ≠ r, ta l u l i hai đ m tđ ng k t thúc b ng c nh đ m m t đ gãn cho m i đ nh v (hai v t đ S[v] đ nh li n tr ng pha t r t i v, ng k t thúc b ng c nh nh t, nh v y có hai lo i v t c c p nh t trình tìm đ ng): c v đ ng pha k t thúc b ng c nh đ m, n u không t n t i đ ng pha lo i c v đ ng pha k t thúc b ng c nh nh t, n u không t n t i đ ng pha lo i S[v] = T[v] đ nh li n tr T[v] = Bên c nh hai nhãn S T, m i đ nh v có thêm Nhãn b[v] đ nh c s c a Blossom ch a v Hai đ nh u v thu c m t Blossom ⇔ b[u] = b[v] Nhãn match[v] đ nh ghép v i đ nh v N u v ch a ghép match[v] = Khi thu t tốn tìm đ B ng m b t đ u t đ nh x ch a ghép có th phát bi u nh sau: c 1: (Init) Hàng đ i Queue dùng đ ch a nh ng đ nh đ m ch t, ban đ u ch g m m t đ nh đ m x V i m i đ nh u, kh i gán b[u] = u match[u] = v i ∀u Gán S[x] ≠ 0; V i ∀u≠x, gán S[u] = 0;V i ∀v: gán T[v] = B c 2: (BFS) L p l i b c sau cho t i hàng đ i r ng: V i m i đ nh đ m u l y t Queue, xét nh ng c nh nh t (u, v): N u v ch a th m: Lê Minh Hoàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chuyên đ 294 N u v đ nh ch a ghép ⇒ Tìm th y đ ng m k t thúc v, d ng N u v đ nh ghép ⇒ th m v ⇒ th m match[v] đ y match[v] vào Queue Sau m i l n th m, ý vi c l u v t (hai nhãn S T) N u v th m N u v đ nh nh t ho c b[v] = b[u] ⇒ b qua N u v đ nh đ m b[v] ≠ b[u] ta phát hi n đ Phát hi n đ nh c s : Truy v t đ c blossom m i ch a u v, đó: ng ng c t hai đ nh đ m u v theo hai đ ng pha v nút g c, ch n l y đ nh a đ nh đ m chung g p đ u tiên trình truy v t ng c Khi Blossom m i phát hi n s có đ nh c s a t hai đ Gán l i v t: G i (a = i1, i2, …, ip = u) (a = j1, j2, …, jq = v) l n l ng pha d n t a t i u v Khi (a = i1, i2, …, ip = u, jq = v, jq-1, …, j1 = a) m t chu trình pha t a t i u v r i quay tr v a B ng cách d c theo chu trình theo hai h ng ng c nhau, ta có th gán l i t t c nhãn S T c a nh ng đ nh chu trình L u ý r ng không đ c gán l i nhãn S T cho nh ng đ nh k mà b[k] = a, v i nh ng đ nh k có b[k] ≠ a b t bu c ph i gán l i nhãn S T theo chu trình b t k S[k] T[k] tr c có hay ch a Ch p Blossom: Xét nh ng đ nh v mà b[v]∈{b[i1], b[i2], …, b[ip], b[j1], b[j2], …, b[jq]}, gán l i b[v] = a N u v đ nh đ m (có nhãn S[v] ≠ 0) mà ch a đ c t t i (ch a bao gi đ Queue) đ y v vào Queue ch t ti p t i nh ng b c sau N u trình ch hàng đ i r ng t c khơng t n t i đ Sau m t s ví d v tr Tr ng m b t đ u t x ng h p t đ nh đ m u xét c nh nh t (u, v): ng h p 1: v ch a th m ch a ghép: S:2 x S:2 T:3 v u u x v T:1 T:1 ⇒ Tìm th y đ Tr c đ y vào ng m ng h p 2: v ch a th m ghép i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thu t toán đ th 295 S:2 S:2 T:3 S:4 v u x v u x T:1 T:1 ⇒ Th m c v l n match[v], gán nhãn T[v] S[match[v]] ng h p 3: v th m, đ nh đ m thu c blossom v i u Tr T:3 S:5 T:7 S:4 u x T:1 S:2 T:3 S:7 v T:5 S:6 b[.] = ⇒ Không xét, b qua ng h p 4: v th m, đ nh đ m b[u] ≠ b[v] Tr T:3 S:4 T:3 S:5 T:7 S:4 a x T:1 S:2 x T:3 S:6 T:1 S:2 8 T:5 S:6 T:3 S:7 ⇒ Phát hi n Blossom, tìm đ nh c s a = 3, gán l i nhãn S T d c chu trình pha y hai đ nh đ m m i 4, vào hàng đ i, T i nh ng b ng m k t 8, truy v t theo nhãn S T tìm đ thúc T t c sau, t t i đ nh 6, s tìm th y đ ng c a ph cđ ng (1, 2, 3, 4, 5, 7, 6, 8) ng pháp Lawler dùng nhãn b[v] thay cho thao tác ch p tr c ti p Blossom, dùng nhãn S T đ truy v t tìm đ d a m t nh n xét: M i tìm đ ng m , tránh thao tác n Blossom Ph ng m , n u đ ng pháp ng m xuyên qua m t Blossom ngồi nh t ch c ch n ph i vào Blossom t nút c s thoát kh i Blossom b ng m t c nh nh t 13.4 CÀI Ta s cài đ t ph T ng pháp Lawler v i khuôn d ng Input/Output nh sau: Lê Minh Hoàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chuyên đ 296 Input: file v n b n GMATCH.INP • Dòng 1: Ch a hai s n, m l n l t s c nh s đ nh c a đ th cách nh t m t d u cách (n ≤ 100) • m dòng ti p theo, m i dòng ch a hai s u, v t ng tr ng cho m t c nh (u, v) c a đ th Output: file v n b n GMATCH.OUT, ghi b ghép c c đ i tìm đ 10 Ch c GMATCH.INP 10 11 12 16 24 28 34 36 56 59 10 78 79 GMATCH.OUT 1) 2) 3) 4) 10 5) ng trình s a đ i m t chút mơ hình cài đ t d a vào nh n xét: v m t đ nh đ m ⇔ v = x ho c match[v] m t đ nh nh t N u v đ nh đ m S[v] = match[v] V y ta khơng c n ph i s d ng riêng m t m ng nhãn S[v], t i m i b nhãn v t T[v] mà c s a v t, ta ch c n s a ki m tra m t đ nh v ≠ x có ph i đ nh đ m hay khơng, ta có th ki m tra b ng u ki n: match[v] có đ nh nh t hay khơng, hay T[match[v]] có khác hay khơng Ch ng trình s d ng bi n v i vai trò nh sau: match[v] đ nh ghép v i đ nh v b[v] đ nh c s c a Blossom ch a v T[v] đ nh li n tr c v đ ng pha t đ nh xu t phát t i v k t thúc b ng c nh nh t, T[v] = n u trình BFS ch a xét t i đ nh nh t v InQueue[v] bi n Boolean, InQueue[v] = True ⇔ v đ nh đ m đ c đ y vào Queue đ ch t start finish: N i b t đ u k t thúc đ ng m P_4_13_1.PAS * Ph ng pháp Lawler áp d ng cho thu t toán Edmonds program MatchingInGeneralGraph; const InputFile = 'GMATCH.INP'; OutputFile = 'GMATCH.OUT'; max = 100; var a: array[1 max, 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; var i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thu t toán đ th 297 i, m, u, v: Integer; f: Text; begin Assign(f, InputFile); Reset(f); FillChar(a, SizeOf(a), False); ReadLn(f, n, m); for i := to m begin ReadLn(f, u, v); a[u, v] := True; a[v, u] := True; end; Close(f); end; procedure Init; {Kh i t o b ghép r ng} begin FillChar(match, SizeOf(match), 0); end; procedure InitBFS; {Th t c đ c g i đ kh i t o tr c tìm đ ng m xu t phát t start} var i: Integer; begin {Hàng đ i ch g m m t đ nh đ m start} first := 1; last := 1; Queue[1] := start; FillChar(InQueue, SizeOf(InQueue), False); InQueue[start] := True; {Các nhãn T đ c kh i gán = 0} FillChar(T, SizeOF(T), 0); {Nút c s c a outermost blossom ch a i i} for i := to n b[i] := i; finish := 0; {finish = ngh a ch a tìm th y đ ng m } end; procedure Push(v: Integer); { y m t đ nh đ m v vào hàng đ i} begin Inc(last); Queue[last] := v; InQueue[v] := True; end; function Pop: Integer; {L y m t đ nh đ m kh i hàng đ i, tr v k t qu hàm} begin Pop := Queue[first]; Inc(first); end; {Khó nh t c a ph ng pháp Lawler th t c này: Th t c x lý g p c nh nh t n i hai đ nh đ m p, q} procedure BlossomShrink(p, q: Integer); var i, NewBase: Integer; Mark: array[1 max] of Boolean; {Th t c tìm nút c s b ng cách truy v t ng c theo đ ng pha t p q} function FindCommonAncestor(p, q: Integer): Integer; var InPath: array[1 max] of Boolean; begin FillChar(InPath, SizeOf(Inpath), False); repeat {Truy v t t p} p := b[p]; {Nh y t i nút c s c a Blossom ch a p, phép nh y đ t ng t c đ truy v t} Inpath[p] := True; { ánh d u nút đó} Lê Minh Hoàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chuyên đ 298 if p = start then Break; {N u truy v đ n n i xu t phát d ng} p := T[match[p]]; {N u ch a v đ n start truy lùi ti p hai b c, theo c nh đ m r i theo c nh nh t} until False; repeat {Truy v t t q, t ng t nh đ i v i p} q := b[q]; if InPath[q] then Break; {Tuy nhiên n u ch m vào đ ng pha c a p d ng ngay} q := T[match[q]]; until False; FindCommonAncestor := q; {Ghi nh n đ nh c s m i} end; procedure ResetTrace(x: Integer); {Gán l i nhãn v t d c đ ng var u, v: Integer; begin v := x; while b[v] NewBase {Truy v t đ ng pha t start t i đ nh đ begin u := match[v]; Mark[b[v]] := True; { ánh d u nhãn blossom c a đ nh Mark[b[u]] := True; v := T[u]; if b[v] NewBase then T[v] := u; {Ch đ t l i v t T[v] n u end; end; pha t start t i x} m x} đ ng đi} b[v] không ph i nút c s m i} begin {BlossomShrink} FillChar(Mark, SizeOf(Mark), False); {T t c nhãn b[v] đ u ch a b đánh d u} NewBase := FindCommonAncestor(p, q); {xác đ nh nút c s } {Gán l i nhãn} ResetTrace(p); ResetTrace(q); if b[p] NewBase then T[p] := q; if b[q] NewBase then T[q] := p; {Ch p blossom ⇔ gán l i nhãn b[i] n u blossom b[i] b đánh d u} for i := to n if Mark[b[i]] then b[i] := NewBase; {Xét nh ng đ nh đ m i ch a đ c đ a vào Queue n m Blossom m i, đ y i Queue đ ch t ti p t i b c sau} for i := to n if not InQueue[i] and (b[i] = NewBase) then Push(i); end; {Th t c tìm đ ng m } procedure FindAugmentingPath; var u, v: Integer; begin InitBFS; {Kh i t o} repeat {BFS} u := Pop; {Xét nh ng đ nh v ch a t, k v i u, không n m for v := to n if (T[v] = 0) and (a[u, v]) and (b[u] b[v]) then begin if match[v] = then {N u v ch a ghép ghi nh begin T[v] := u; finish := v; Exit; end; {N u v đ nh đ m gán l i v t, ch p Blossom if (v = start) or (T[match[v]] 0) then BlossomShrink(u, v) else {N u khơng ghi v t đ ng đi, th m v, th Blossom v i u, d nhiên T[v] = (u, v) c nh nh t r i} n đ nh k t thúc đ ng m thoát ngay} …} m c match[v] đ y ti p match[v] vào Queue} i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thu t toán đ th 299 begin T[v] := u; Push(match[v]); end; end; until first > last; end; procedure Enlarge; {N i r ng b ghép b i đ ng m b t đ u t start, k t thúc var v, next: Integer; begin repeat v := T[finish]; next := match[v]; match[v] := finish; match[finish] := v; finish := next; until finish = 0; end; finish} procedure Solve; {Thu t toán Edmonds} var u: Integer; begin for u := to n if match[u] = then begin start := u; {V i m i đ nh ch a ghép start} FindAugmentingPath; {Tìm đ ng m b t đ u t start} if finish then Enlarge; {N u th y n i r ng b ghép theo đ ng m này} end; end; procedure Result; {In b ghép tìm đ c} var u, count: Integer; f: Text; begin Assign(f, OutputFile); Rewrite(f); count := 0; for u := to n if match[u] > u then {V a tránh s trùng l p (u, v) (v, u), v a lo i nh ng đ nh không ghép đ c (match=0)} begin Inc(count); WriteLn(f, count, ') ', u, ' ', match[u]); end; Close(f); end; begin Enter; Init; Solve; Result; end 13.5 PH C T P TÍNH TỐN Th t c BlossomShrink có đ ph c t p O(n) Th t c FindAugmentingPath c n không n l n g i th t c BlossomShrink, c ng thêm chi phí c a thu t tốn tìm ki m theo chi u r ng, có đ ph c t p Lê Minh Hoàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chuyên đ 300 O(n2) Ph ng pháp Lawler c n không n l n g i th t c FindAugmentingPath nên có đ ph c t p tính tốn O(n3) Cho đ n nay, ph ng pháp t t nh t đ gi i tốn tìm b ghép t ng quát đ th đ c bi t đ n c a Micali Varizani (1980), có đ ph c t p tính tốn O( n m) B n có th tham kh o tài li u khác i h c S ph m Hà N i, 1999-2002 CuuDuongThanCong.com https://fb.com/tailieudientucntt TÀI LI U C THÊM [1] Christian Charras, Thierry Lecroq Handbook of Exact String-Matching Algorithms G n 20 thu t tốn tìm ki m chu i, có di n gi i đ y đ [2] Reinhard Diestel Graph Theory M t cu n sách chuyên v Lý thuy t đ th [3] Johan Håstad Advanced Algorithms [4] Andrew J Manson Speaker Matching Bài báo nói v thu t tốn tìm b ghép đ th t ng quát, c tr ng h p đ th có tr ng s [5] Eva Milková Graph Theory and Information Technology M t s thu t toán v toán bao trùm t i ti u [6] Dave Mount Design and Analysis of Computer Algorithms [7] Nguy n Xuân My, Tr n Hùng, Lê S Quang M t s v n đ ch n l c tin h c Cu n sách r t phù h p cho h c sinh ph thơng trung h c u thích vi c gi i toán tin h c [8] Nguy n c Ngh a, Nguy n Tơ Thành Tốn r i r c M t cu n sách r t c n b n dành cho sinh viên ngành tin h c [9] Kenneth H Rosen Discrete Mathematics and its Applications (B n d ch ti ng Vi t: Toán h c r i r c ng d ng tin h c) Cu n sách vi t d hi u, có h th ng t p đ i d ng giáo trình r t d c s p x p r t khoa h c [10] Robert Sedgewick Algorithms (B n d ch ti ng Vi t: C m Nang Thu t Toán) M t cu n sách r t ti n l i cho tra c u, đ y đ thu t toán kinh n CuuDuongThanCong.com https://fb.com/tailieudientucntt In memory of committed teachers and excellent students Le Minh Hoang CuuDuongThanCong.com https://fb.com/tailieudientucntt ... Bài Các ch ch ng trình x lý không t t tr ng h p t m th ng trình li t kê dãy nh phân c ng nh ch v i ch ng, tr ng h p n = đ i v i ng trình li t kê hốn v , tr ng h p k = đ i ng trình li t kê t h... i t p {1, 3} Hãy l p ch ng trình in t t c t p c a {1, 2, …, n} theo hai ph ng pháp Bài Nh p vào danh sách tên n ng i, in t t c cách x p n ng i vào m t bàn Bài Nh p vào danh sách n b n nam n b... khác 15 ng trình ch ng trình li t kê dãy nh phân đ dài n, ta th y v c b n chúng th t c Try(i) - ch n th giá tr cho xi, th ch n giá tr ho c ch ch ng trình li t kê dãy nh phân ta ng trình li t