Bài giải Cấu trúc dữ liệu và giải thuật. Các bạn sẽ tìm được đầy đủ thông tin và cách giải tại đây
LÊ MINH HOÀNG BÀI GI NG CHUYÊN : GI I THU T VÀ L P TRÌNH Bài gi ng chuyên i h c S ph m Hà N i, 1999-2002 Try not to become a man of success but rather to become a man of value Albert Einstein 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 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 TOÁ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 U 24 4.2 S 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 27 PH N C U TRÚC D §1 CÁC B 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 1.1 XÁC 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 TỐ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 GI I THI U 40 2.2 CÁC KÝ PHÁP ÁNH GIÁ PH C T P TÍNH TỐN 40 2.3 XÁC NH PH C T P TÍNH TOÁN C A GI I THU T 42 2.4 PH C T P TÍNH TỐN V I TÌNH TR NG D LI U VÀO 45 2.5 CHI PHÍ TH C HI N THU T TỐN 46 ii §3 QUY VÀ GI I THU T QUY 50 3.1 KHÁI NI M V QUY 50 3.2 GI I THU T QUY 50 3.3 VÍ D V GI I THU T QUY 51 3.4 HI U L C C A QUY .55 §4 C U TRÚC D LI U BI U DI N DANH SÁCH 58 4.1 KHÁI NI M DANH SÁCH 58 4.2 BI U DI N DANH SÁCH TRONG MÁY TÍNH 58 §5 NG N X P VÀ HÀNG I 64 5.1 NG N X P (STACK) .64 5.2 HÀNG I (QUEUE) .66 §6 CÂY (TREE) 70 6.1 NH NGH A 70 6.2 CÂY NH PHÂN (BINARY TREE) 71 6.3 BI U DI N CÂY NH PHÂN 73 6.4 PHÉP DUY T CÂY NH PHÂN 74 6.5 CÂY K_PHÂN 76 6.6 CÂY T NG QUÁT 77 §7 KÝ PHÁP TI N T , TRUNG T VÀ H U T 79 7.1 BI U TH C D I D NG CÂY NH PHÂN 79 7.2 CÁC KÝ PHÁP CHO CÙNG M T BI U TH C 79 7.3 CÁCH TÍNH GIÁ TR BI U TH C 79 7.4 CHUY N T D NG TRUNG T SANG D NG H U T 83 7.5 XÂY D NG CÂY NH PHÂN BI U DI N BI U TH C 86 §8 S P X P (SORTING) 87 8.1 BÀI TOÁN S P X P 87 8.2 THU T TOÁN S P X P KI U CH N (SELECTIONSORT) .89 8.3 THU T TOÁN S P X P N I B T (BUBBLESORT) 90 8.4 THU T TOÁN S P X P KI U CHÈN 90 8.5 SHELLSORT 92 8.6 THU T TOÁN S P X P KI U PHÂN O N (QUICKSORT) 93 8.7 THU T TOÁN S P X P KI U VUN NG (HEAPSORT) 99 8.8 S P X P B NG PHÉP M PHÂN PH I (DISTRIBUTION COUNTING) 102 8.9 TÍNH N NH C A THU T TOÁN S P X P (STABILITY) 103 8.10 THU T TOÁN S P X P B NG C S (RADIX SORT) 104 8.11 THU T TOÁN S P X P TR N (MERGESORT) 109 8.12 CÀI T .112 8.13 ÁNH GIÁ, NH N XÉT 119 §9 TÌM KI M (SEARCHING) 124 9.1 BÀI TỐN TÌM KI M 124 9.2 TÌM KI M TU N T (SEQUENTIAL SEARCH) .124 9.3 TÌM KI M NH PHÂN (BINARY SEARCH) 124 9.4 CÂY NH PHÂN TÌM KI M (BINARY SEARCH TREE - BST) .125 iii 9.5 PHÉP B M (HASH) 130 9.6 KHOÁ S V I BÀI TỐN TÌM KI M 130 9.7 CÂY TÌM KI M S H C (DIGITAL SEARCH TREE - DST) 131 9.8 CÂY TÌM KI M C S (RADIX SEARCH TREE - RST) 134 9.9 NH NG NH N XÉT CU I CÙNG 139 PH N QUY HO CH NG 141 §1 CÔNG TH C TRUY H I 142 1.1 VÍ D 142 1.2 C I TI N TH NH T 143 1.3 C I TI N TH HAI 144 1.4 CÀI T QUY 145 §2 PH NG PHÁP QUY HO CH NG 147 2.1 BÀI TOÁN QUY HO CH 147 2.2 PH NG PHÁP QUY HO CH NG 147 §3 M T S BÀI TOÁN QUY HO CH NG 151 3.1 DÃY CON N I U T NG DÀI NH T 151 3.2 BÀI TOÁN CÁI TÚI 156 3.3 BI N I XÂU 158 3.4 DÃY CON CÓ T NG CHIA H T CHO K 162 3.5 PHÉP NHÂN T H P DÃY MA TR N 166 3.6 BÀI T P LUY N T P 170 PH N CÁC THU T TỐN TRÊN §1 CÁC KHÁI NI M C TH 175 B N .176 1.1 NH NGH A TH (GRAPH) 176 1.2 CÁC KHÁI NI M 177 §2 BI U DI N TH TRÊN MÁY TÍNH 179 2.1 MA TR N K (ADJACENCY MATRIX) 179 2.2 DANH SÁCH C NH (EDGE LIST) 180 2.3 DANH SÁCH K (ADJACENCY LIST) 181 2.4 NH N XÉT 182 §3 CÁC THU T TỐN TÌM KI M TRÊN TH 184 3.1 BÀI TOÁN 184 3.2 THU T TỐN TÌM KI M THEO CHI U SÂU (DEPTH FIRST SEARCH) 185 3.3 THU T TỐN TÌM KI M THEO CHI U R NG (BREADTH FIRST SEARCH) 187 3.4 PH C T P TÍNH TỐN C A BFS VÀ DFS 190 §4 TÍNH LIÊN THƠNG C A TH 191 4.1 NH NGH A 191 4.2 TÍNH LIÊN THƠNG TRONG TH VƠ H NG 192 iv 4.3 TH Y VÀ THU T TOÁN WARSHALL 192 4.4 CÁC THÀNH PH N LIÊN THÔNG M NH 195 §5 VÀI NG D NG C A DFS BFS 206 5.1 XÂY D NG CÂY KHUNG C A TH 206 5.2 T P CÁC CHU TRÌNH C S C A TH 209 5.3 BÀI TOÁN NH CHI U TH 209 5.4 LI T KÊ CÁC KH P VÀ C U C A TH 213 §6 CHU TRÌNH EULER, NG I EULER, TH EULER 216 6.1 BÀI TOÁN CÁI C U 216 6.2 NH NGH A 216 6.3 NH LÝ 216 6.4 THU T TOÁN FLEURY TÌM CHU TRÌNH EULER 217 6.5 CÀI T 218 6.6 THU T TOÁN T T H N 220 §7 CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 223 7.1 NH NGH A 223 7.2 NH LÝ 223 7.3 CÀI T 224 §8 BÀI TOÁN NG I NG N NH T 228 8.1 TH CÓ TR NG S 228 8.2 BÀI TOÁN NG I NG N NH T 228 8.3 TR NG H P TH KHÔNG CĨ CHU TRÌNH ÂM - THU T TỐN FORD BELLMAN 230 8.4 TR NG H P TR NG S TRÊN CÁC CUNG KHƠNG ÂM - THU T TỐN DIJKSTRA 232 8.5 THU T TOÁN DIJKSTRA VÀ C U TRÚC HEAP .235 8.6 TR NG H P TH KHƠNG CĨ CHU TRÌNH - S P X P TƠ PƠ 238 8.7 NG I NG N NH T GI A M I C P NH - THU T TOÁN FLOYD 241 8.8 NH N XÉT .243 §9 BÀI TỐN CÂY KHUNG NH NH T 248 9.1 BÀI TOÁN CÂY KHUNG NH NH T 248 9.2 THU T TOÁN KRUSKAL (JOSEPH KRUSKAL - 1956) 248 9.3 THU T TOÁN PRIM (ROBERT PRIM - 1957) 253 §10 BÀI TOÁN LU NG C C I TRÊN M NG 257 10.1 CÁC KHÁI NI M 257 10.2 M NG TH NG D VÀ NG T NG LU NG 260 10.3 THU T TOÁN FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) .263 10.4 THU T TOÁN PREFLOW-PUSH (GOLDBERG - 1986) 267 10.5 M T S M R NG 273 §11 BÀI TỐN TÌM B GHÉP C C I TRÊN TH HAI PHÍA 280 11.1 TH HAI PHÍA (BIPARTITE GRAPH) 280 11.2 BÀI TỐN GHÉP ƠI KHƠNG TR NG VÀ CÁC KHÁI NI M .280 11.3 THU T TOÁN NG M .281 11.4 CÀI T .282 v §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 288 12.1 BÀI TOÁN PHÂN CÔNG 288 12.2 PHÂN TÍCH 288 12.3 THU T TOÁN 289 12.4 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 297 12.5 NÂNG C P 298 §13 BÀI TỐN TÌM B GHÉP C C I TRÊN TH 304 13.1 CÁC KHÁI NI M 304 13.2 THU T TOÁN EDMONDS (1965) 305 13.3 THU T TOÁN LAWLER (1973) 307 13.4 CÀI T 309 13.5 PH C T P TÍNH TỐN 313 TÀI LI U C THÊM 315 vi HÌNH V Hình 1: Cây tìm ki m quay lui tốn li t kê dãy nh phân .13 Hình 2: X p quân h u bàn c 8x8 .19 Hình 3: ng chéo B-TN mang ch s 10 Hình 4: L u ng chéo N-TB mang ch s 19 thu t gi i (Flowchart) 36 Hình 5: Ký pháp l n, l n l n 41 Hình 6: Tháp Hà N i .54 Hình 7: C u trúc nút c a danh sách n i Hình 8: Danh sách n i n 59 n 59 Hình 9: C u trúc nút c a danh sách n i kép 61 Hình 10: Danh sách n i kép 61 Hình 11: Danh sách n i vòng m t h ng 61 Hình 12: Danh sách n i vòng hai h ng .62 Hình 13: Dùng danh sách vịng mơ t Queue 67 Hình 14: Di chuy n toa tàu 69 Hình 15: Di chuy n toa tàu (2) 69 Hình 16: Cây 70 Hình 17: M c c a nút 71 Hình 18: Cây bi u di n bi u th c 71 Hình 19: Các d ng nh phân suy bi n 72 Hình 20: Cây nh phân hồn ch nh nh phân y Hình 21: ánh s nút c a nh phân bi u di n b ng m ng 73 Hình 22: Nh c i m c a ph y .72 ng pháp bi u di n b ng m ng .73 Hình 23: C u trúc nút c a nh phân .74 Hình 24: Bi u di n b ng c u trúc liên k t .74 Hình 25: ánh s nút c a 3_phân bi u di n b ng m ng 76 Hình 26: Bi u di n t ng quát b ng m ng 77 Hình 27: C u trúc nút c a t ng quát 78 Hình 28: Bi u th c d i d ng nh phân 79 Hình 29: Vịng l p c a QuickSort 94 Hình 30: Tr ng thái tr c g i quy 95 Hình 31: Heap 100 Hình 32: Vun Hình 33: ng 100 o giá tr k[1] cho k[n] xét ph n l i 101 Hình 34: Vun ph n cịn l i thành ng r i l i o tr k[1] cho k[n-1] 101 Hình 35: ánh s bit .104 Hình 36: Thu t tốn s p x p tr n .109 Hình 37: Cài t thu t toán s p x p v i d li u l n 121 vii Hình 38: Cây nh phân tìm ki m 126 Hình 39: Xóa nút BST 127 Hình 40 Xóa nút ch có m t nhánh BST 128 Hình 41: Xóa nút có c hai nhánh BST thay b ng nút c c ph i c a trái 128 Hình 42: Xóa nút có c hai nhánh BST thay b ng nút c c trái c a ph i 128 Hình 43: ánh s bit 131 Hình 44: Cây tìm ki m s h c 131 Hình 45: Cây tìm ki m c s 134 Hình 46: V i dài dãy bit z = 3, tìm ki m c s g m khoá 2, 4, sau thêm giá tr 135 Hình 47: RST ch a khoá 2, 4, 5, RST sau lo i b giá tr 136 Hình 48: Cây tìm ki m c s a) Trie tìm ki m c s b) 138 Hình 49: Hàm quy tính s Fibonacci 149 Hình 50: Tính tốn truy v t 152 Hình 51: Truy v t 160 Hình 52: Ví d v mơ hình Hình 53: Phân lo i th 176 th 177 Hình 54 180 Hình 55 181 Hình 56: th ng i 184 Hình 57: Cây DFS 187 Hình 58: Cây BFS 190 Hình 59: th G thành ph n liên thơng G1, G2, G3 c a 191 Hình 60: Kh p c u 191 Hình 61: Liên thơng m nh liên thơng y u 192 Hình 62: th Hình 63: n y 193 th vơ h ng bao óng c a 193 Hình 64: Ba d ng cung DFS 197 Hình 65: Thu t toán Tarjan "b " DFS 199 Hình 66: ánh s l i, o chi u cung t BFS v i cách ch n nh xu t phát ng c l i v i th t t xong (th t 11, 10… 3, 2, 1) 204 Hình 67: th G m t s ví d khung T1, T2, T3 c a 208 Hình 68: Cây khung DFS (a) khung BFS (b) (M i tên ch chi u i th m Hình 69: Phép nh) 208 nh chi u DFS 211 Hình 70: Phép ánh s ghi nh n cung ng Hình 71: Mơ hình c lên cao nh t 213 th c a toán b y c u 216 Hình 72 217 Hình 73 217 Hình 74 223 Hình 75: Phép ánh l i ch s theo th t tôpô 238 Hình 76: Hai g c r1 r2 m i h p nh t chúng 249 viii Hình 77: M ng v i kh n ng thông qua (1 phát, thu) m t lu ng c a v i giá tr 257 Hình 78: M ng G m ng th ng d Gf t ng ng (ký hi u f[u,v]:c[u,v] ch lu ng f[u, v] kh n ng thông qua c[u, v] cung (u, v)) 261 Hình 79: M ng th ng d Hình 80: Lu ng m ng G tr ng t ng lu ng 262 c sau t ng 262 Hình 81: M ng gi c a m ng có nhi u i m phát nhi u i m thu 273 Hình 82: Thay m t nh u b ng hai nh uin, uout 274 Hình 83: M ng gi c a m ng có kh n ng thơng qua c a cung b ch n hai phía 274 Hình 84: th hai phía 280 Hình 85: th hai phía b ghép M .281 Hình 86: Mơ hình lu ng c a tốn tìm b ghép c c i th hai phía 285 Hình 87: Phép xoay tr ng s c nh .289 Hình 88: Thu t toán Hungari .292 Hình 89: Cây pha "m c" l n h n sau m i l n xoay tr ng s c nh tìm Hình 90: ng 299 th G m t b ghép M 304 Hình 91: Phép ch p Blossom .306 Hình 92: N Blossom dò ng xuyên qua Blossom .306 304 Chun §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 chung Bài tốn tìm b ghép c c Cho m t i th G m t t p c nh m t khơng có th t ng qt phát bi u nh sau: th G, ph i tìm m t b ghép c c V i m t b ghép M c a Nh ng c nh thu c M nh i G (b ghép có nhi u c nh nh t) th G, ta g i: c g i c nh ã ghép hay c nh Nh ng c nh không thu c M m c g i c nh ch a ghép hay c nh nh t Nh ng nh u mút c a c nh nh ch a ghép m c g i nh ã ghép, nh ng nh l i g i M t ng i c b n ( ng i khơng có nh l p l i) c g 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 i qua nh t m, nh t n m n i c g i nh c ng m m t ghép Ví d : V i n (chu trình khơng có nh l p l i) c g i m t Blossom n u nh, b t u k t thúc b ng c nh nh t d c chu trình, c nh ti p xen k nh xu t phát c a chu trình (c ng nh k t thúc) s (base) c a Blossom ng pha b t u m t nh ch a ghép k t thúc m t nh ch a th G b ghép M Hình 90: 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 pha (và t t nhiên không ph i ng m ) ây khơng ph i ng i c b n ng Hình 90: th G m t b ghép M Ta d dàng suy c tính ch t sau: HSPHN 1999-2004 Lý thuy t th ng m c ng nh Blossom c nh m úng c nh 305 u ng i Trong m i Blossom, nh ng nh khơng ph i v i nh ó c ng ph i thu c Blossom dài l v i s c nh nh t nhi u h n s nh c s u nh ã ghép nh ghép 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 i n nó, m t ng k t thúc b ng c nh m m t ng k t thúc b ng c nh nh t, hai ng pha c hình thành b ng cách i d c theo chu trình theo hai h ng ng c Nh ví d Hình 90, nh có hai ng pha i nh c s i t i: (2, 3, 4) ng pha k t thúc b ng c nh m (2, 5, 6, 4) 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 không t n t i ng m i v i M th G c c i ch Thu t toán Edmonds: M := ; nh u ch a ghép) for ( if Tìm ng m xu t phát t u then D c ng m : Lo i b nh ng c nh Tr v M b ghép c c i G ; m kh i M; Thêm vào M nh ng c nh nh t ; i u khó nh t thu t toán Edmonds ph i xây d ng thu t tốn tìm ng m xu t phát t m t nh ch a ghép Thu t tốn ó 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 b ng m t ng pha k t thúc c nh nh t c gán nhãn "nh t", nh ng nh có th t x b ng m t ng pha k t thúc c nh m c gán nhãn " m" ct x n c 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 306 Chuyên Shrink Shrink Blossom Blossom = = nh c s c a blossom nh ch p t blossom Hình 91: Phép ch p Blossom Thu t tốn tìm Tr ch t ng m xu t phát t nh xu t phát x nh x có th phát bi u nh sau c gán nhãn m Ti p theo thu t toán tìm ki m th b t u t x, theo nguyên t c: t nh m ch c phép i ti p theo c nh nh t t nh nh t ch c i 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 ng h p này, Blossom 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 cb t ul iv i th m i cho t i tr l i c câu h i: "có t n t i ng m xu t phát t x hay khơng?" N u ng m tìm c khơng i qua nh ch p ta ch vi c t ng c p d c theo ng m N u ng m có i qua m t nh ch p ta l i n nh ch p ó thành Blossom thay nh ch p ng m b ng m t o n ng xuyên qua Blossom: Expand Hình 92: N Blossom dị Expand ng xuyên qua Blossom HSPHN 1999-2004 Lý thuy t th 307 L u ý r ng không ph i Blossom c ng b ch p, ch nh ng Blossom nh h ng t i trình tìm ng m m i ph i ch p m b o r ng ng m tìm c ng i 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(n ) D i ây 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 tốn 13.3 THU T TỐN LAWLER (1973) Trong thu t toán Edmonds, sau ch p m i Blossom thành m t nh nh ó hoàn toàn l i có th n m m t Blossom m i b ch p ti p Thu t toán 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 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 ng pha t r t i v, m t ng k t thúc b ng c nh m m t ng k t thúc b ng c nh nh t, nh v y có hai lo i v t gãn cho m i nh v (hai v t c c p nh t trình tìm ng): S[v] nh li n tr c v lo i S[v] = ng pha k t thúc b ng c nh m, n u không t n t i ng pha T[v] nh li n tr c v lo i T[v] = ng pha k t thúc b ng c nh nh t, n u không t n t i ng pha Bên c nh hai nhãn S T, m i nh v cịn 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 Khi ó thu t tốn tìm B nh v N u v ch a ghép match[v] = ng m b t ut nh x ch a ghép có th phát bi u nh sau: c 1: (Init) Hàng i Queue dùng V im i Gán S[x] ch a nh ng nh m ch t, ban nh u, kh i gán b[u] = u match[u] = v i u V i u x, gán S[u] = V i v: gán T[v] = B c 2: (BFS) L p l i b V im i nh Lê Minh Hoàng c sau cho t i hàng i r ng: m u l y t Queue, xét nh ng c nh nh t (u, v): u ch g m m t nh m x 308 Chuyên N u v ch a th m: N u: v nh ch a ghép v nh ã ghép Tìm th y th m v ng m k t thúc v, d ng th m match[v] y match[v] vào Queue L u v t: C p nh t hai nhãn S T N u v ã th m N u v nh nh t ho c b[v] = b[u] N u v nh m b[v] b qua b[u] ta phát hi n c blossom m i ch a u v, ó: Phát hi n nh c s : Truy v t ng i 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 Gán l i v t: G i (a = i[1], i[2], …, i[p] = u) (a = j[1], j[2], …, j[q] = v) l n l t hai ng pha d n t a t i u v Khi ó (a = i[1], i[2], …, i[p] = u, j[q] = v, j[q1], …, j[1] = a) m t chu trình pha i t a t i u v r i quay tr v a B ng cách i 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] nhãn S T theo chu trình b t k S[k] T[k] tr Ch p Blossom: Xét nh ng c t t i (ch a bao gi ti p t i nh ng b c sau c nh y vào Queue) 0) mà ch a y v vào Queue ch t ng m tr v ng m , n u b c khơng tìm th y i r ng k t lu n khơng tìm th y ng m Sau ây m t s ví d v tr ng h p t nh ng m 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 u u v x v T:1 T:1 Tìm th y Tr m (có nhãn S[v] c 3: N u b c tìm hàng Tr c ó ã có hay ch a nh v mà b[v] {b[i[1]], b[i[2]], …, b[i[p]], b[j[1]], b[j[2]], …, b[j[q]]}, gán l i b[v] = a N u v B a b t bu c ph i gán l i ng m ng h p 2: v ch a th m ã ghép HSPHN 1999-2004 Lý thuy t th 309 S:2 S:2 S:4 v u x T:3 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, Tr nh m thu c blossom v i u 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, Tr nh T:3 m b[u] b[v] T:3 S:5 T:7 S:4 S:4 a x T:1 S:2 x S:6 Phát hi n Blossom, tìm nh S:2 T:3 T:1 T:3 S:7 nh c s a = 3, gán l i nhãn S T d c chu trình pha m m i 4, vào hàng i, T i nh ng b c sau, t t i nh 6, s tìm th y m k t thúc 8, truy v t theo nhãn S T tìm c ng (1, 2, 3, 4, 5, 7, 6, 8) T:5 S:6 y hai ng T t ng c a ph 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 ng m , tránh thao tác n Blossom Ph ng pháp d a m t nh n xét: M i tìm ng m , n u ng m ó xuyên qua m t Blossom ngồi nh t ch c ch n ph i 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 t ph ng pháp Lawler v i khuôn d ng Input/Output nh sau: Input: file v n b n GMATCH.INP Lê Minh Hồng 310 Chun Dịng 1: Ch a hai s n, m l n l cách (n t s c nh s nh c a 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 Output: file v n b n GMATCH.OUT, ghi b ghép c c 10 Ch th cách nh t m t d u ng trình s a i m t chút mơ hình cài v m t nh m N u v nh i tìm th c GMATCH.INP 10 11 12 16 24 28 34 36 56 59 10 78 79 GMATCH.OUT 1) 2) 3) 4) 10 5) t d a vào nh n xét: v = x ho c match[v] m t nh nh t 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 s a nhãn v t T[v] mà ki m tra m t ki m tra b ng i u ki n: match[v] có khơng Ch nh v x có ph i nh c s a v t, ta ch c n m hay khơng, ta có th nh nh t hay khơng, hay T[match[v]] có khác hay ng trình s d ng bi n v i vai trò nh sau: match[v] b[v] nh ghép v i nh 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, Front, Rear, start, finish: Integer; procedure Enter; var i, m, u, v: Integer; HSPHN 1999-2004 Lý thuy t th 311 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 cgi kh i t o tr c tìm var i: Integer; begin {Hàng i ch g m m t nh m start} Front := 1; Rear := 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 begin Inc(Rear); Queue[Rear] := v; InQueue[v] := True; end; nh function Pop: Integer; {L y m t begin Pop := Queue[Front]; Inc(Front); end; m kh i hàng nh m v vào hàng ng m xu t phát t start} i} i, tr v k t qu hàm} {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 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 InPath[p] := True; { ánh d u nút ó} Lê Minh Hoàng nh truy v t} m p, q} 312 Chuyên 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 pha t start t i x} var u, v: Integer; begin v := x; while b[v] NewBase {Truy v t ng pha t start t i nh m x} begin u := match[v]; Mark[b[v]] := True; { ánh d u nhãn blossom c a nh ng i} 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 b[v] không ph i nút c s m i} end; end; 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 for i := to n if not InQueue[i] and (b[i] = NewBase) then Push(i); end; ch t sau} {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 Blossom v i u} for v := to n if (T[v] = 0) and (a[u, v]) and (b[u] b[v]) then {d nhiên T[v] = (u, v) c nh nh t r i} begin if match[v] = then {N u v ch a ghép ghi nh n nh k t thúc ng m thoát ngay} 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) HSPHN 1999-2004 Lý thuy t th else {N u khơng ghi v t begin T[v] := u; Push(match[v]); end; end; until Front > Rear; end; procedure Enlarge; {N i r ng b ghép b i var v, next: Integer; begin repeat v := T[finish]; next := match[v]; match[v] := finish; match[finish] := v; finish := next; until finish = 0; end; 313 ng i, th m v, th m c match[v] ng m b t u t start, k t thúc 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 end; end; y ti p match[v] vào Queue} finish} ng m này} 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 begin Inc(count); WriteLn(f, count, ') ', u, ' ', match[u]); end; Close(f); end; nh không ghép c (match=0)} 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ó Lê Minh Hồng 314 Chun ph c t p 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 qt bi t n c a Micali Vazizani (1980), có th 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 HSPHN 1999-2004 TÀI LI U C THÊM D i ây hai cu n sách có th nói kinh i n mà h u h t tài li u v thu t tốn trích d n nhi u t hai cu n sách Các b n nên tìm m i cách c Title: The Art of Computer Programming Author: Donald E Knuth Volume 1: Fundamental Algorithms Volume 2: Seminumerical Algorithms Volume 3: Sorting and Searching Volume 4: Combinatorial Algorithms (in preparation) Volume 5: Syntactic Algorithms (in preparation) Title: Introduction to Algorithms Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest u ... b c xây d ng c u trúc d li u không th tách r i b c tìm ki m thu t tốn gi i quy t v n HSPHN 1999-2004 C u trúc d li u gi i thu t 35 Các tiêu chu n l a ch n c u trúc d li u C u trúc d li u tr toán... {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 HSPHN 1999-2004 Bài toán li t kê 11 Bài Nh p vào danh sách n b n nam n b n n , in t t... 27 PH N C U TRÚC D §1 CÁC B 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 1.1 XÁC NH BÀI TOÁN 34 1.2 TÌM C U TRÚC D LI U BI U DI N BÀI