Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 334 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
334
Dung lượng
16,59 MB
Nội dung
LÊ MINH HOÀNG (A.K.A DSAP Textbook) 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 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 17 3.5 BÀI TOÁN X P H U 19 §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 TỐ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 TOÁ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) 88 8.1 BÀI TOÁN S P X P 88 8.2 THU T TOÁN S P X P KI U CH N (SELECTIONSORT) .90 8.3 THU T TOÁN S P X P N I B T (BUBBLESORT) 91 8.4 THU T TOÁN S P X P KI U CHÈN (INSERTIONSORT) 91 8.5 S P X P CHÈN V I DÀI B C GI M D N (SHELLSORT) .93 8.6 THU T TOÁN S P X P KI U PHÂN O N (QUICKSORT) 94 8.7 THU T TOÁN S P X P KI U VUN NG (HEAPSORT) 101 8.8 S P X P B NG PHÉP M PHÂN PH I (DISTRIBUTION COUNTING) 104 8.9 TÍNH N NH C A THU T TỐN S P X P (STABILITY) 105 8.10 THU T TOÁN S P X P B NG C S (RADIX SORT) 106 8.11 THU T TOÁN S P X P TR N (MERGESORT) 111 8.12 CÀI T .114 8.13 ÁNH GIÁ, NH N XÉT 122 §9 TÌM KI M (SEARCHING) 126 9.1 BÀI TỐN TÌM KI M 126 9.2 TÌM KI M TU N T (SEQUENTIAL SEARCH) .126 9.3 TÌM KI M NH PHÂN (BINARY SEARCH) 126 9.4 CÂY NH PHÂN TÌM KI M (BINARY SEARCH TREE - BST) .127 iii 9.5 PHÉP B M (HASH) 132 9.6 KHỐ S V I BÀI TỐN TÌM KI M 132 9.7 CÂY TÌM KI M S H C (DIGITAL SEARCH TREE - DST) 133 9.8 CÂY TÌM KI M C S (RADIX SEARCH TREE - RST) 136 9.9 NH NG NH N XÉT CU I CÙNG 141 PH N QUY HO CH NG 143 §1 CƠNG TH C TRUY H I 144 1.1 VÍ D 144 1.2 C I TI N TH NH T 145 1.3 C I TI N TH HAI 147 1.4 CÀI T QUY 147 §2 PH NG PHÁP QUY HO CH NG 149 2.1 BÀI TOÁN QUY HO CH 149 2.2 PH NG PHÁP QUY HO CH NG 149 §3 M T S BÀI TỐN QUY HO CH NG 153 3.1 DÃY CON N I U T NG DÀI NH T 153 3.2 BÀI TOÁN CÁI TÚI 158 3.3 BI N I XÂU 160 3.4 DÃY CON CÓ T NG CHIA H T CHO K 164 3.5 PHÉP NHÂN T H P DÃY MA TR N 169 3.6 BÀI T P LUY N T P 172 PH N CÁC THU T TỐN TRÊN §1 CÁC KHÁI NI M C TH 177 B N .178 1.1 NH NGH A TH (GRAPH) 178 1.2 CÁC KHÁI NI M 179 §2 BI U DI N TH TRÊN MÁY TÍNH 181 2.1 MA TR N K (ADJACENCY MATRIX) 181 2.2 DANH SÁCH C NH (EDGE LIST) 182 2.3 DANH SÁCH K (ADJACENCY LIST) 183 2.4 NH N XÉT 184 §3 CÁC THU T TỐN TÌM KI M TRÊN TH 186 3.1 BÀI TOÁN 186 3.2 THU T TỐN TÌM KI M THEO CHI U SÂU (DEPTH FIRST SEARCH) 187 3.3 THU T TỐN TÌM KI M THEO CHI U R NG (BREADTH FIRST SEARCH) 189 3.4 PH C T P TÍNH TỐN C A BFS VÀ DFS 192 §4 TÍNH LIÊN THƠNG C A TH 193 4.1 NH NGH A 193 4.2 TÍNH LIÊN THÔNG TRONG TH VÔ H NG 194 iv 4.3 TH Y VÀ THU T TOÁN WARSHALL 194 4.4 CÁC THÀNH PH N LIÊN THÔNG M NH 197 §5 VÀI NG D NG C A DFS BFS 208 5.1 XÂY D NG CÂY KHUNG C A TH 208 5.2 T P CÁC CHU TRÌNH C S C A TH 211 5.3 BÀI TOÁN NH CHI U TH 211 5.4 LI T KÊ CÁC KH P VÀ C U C A TH 215 §6 CHU TRÌNH EULER, NG I EULER, TH EULER 219 6.1 BÀI TOÁN CÁI C U 219 6.2 NH NGH A 219 6.3 NH LÝ 219 6.4 THU T TỐN FLEURY TÌM CHU TRÌNH EULER 220 6.5 CÀI T 221 6.6 THU T TOÁN T T H N 223 §7 CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 226 7.1 NH NGH A 226 7.2 NH LÝ 226 7.3 CÀI T 227 §8 BÀI TỐN NG I NG N NH T 231 8.1 TH CÓ TR NG S 231 8.2 BÀI TOÁN NG I NG N NH T 231 8.3 TR NG H P TH KHƠNG CĨ CHU TRÌNH ÂM - THU T TOÁN FORD BELLMAN 233 8.4 TR NG H P TR NG S TRÊN CÁC CUNG KHÔNG ÂM - THU T TOÁN DIJKSTRA 235 8.5 THU T TOÁN DIJKSTRA VÀ C U TRÚC HEAP .238 8.6 TR NG H P TH KHƠNG CĨ CHU TRÌNH - S P X P TÔ PÔ 241 8.7 NG I NG N NH T GI A M I C P NH - THU T TOÁN FLOYD 244 8.8 NH N XÉT .246 §9 BÀI TỐN CÂY KHUNG NH NH T 251 9.1 BÀI TOÁN CÂY KHUNG NH NH T 251 9.2 THU T TOÁN KRUSKAL (JOSEPH KRUSKAL - 1956) 251 9.3 THU T TOÁN PRIM (ROBERT PRIM - 1957) 256 §10 BÀI TỐN LU NG C C I TRÊN M NG 260 10.1 CÁC KHÁI NI M 260 10.2 M NG TH NG D VÀ NG T NG LU NG 263 10.3 THU T TOÁN FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) .266 10.4 THU T TOÁN PREFLOW-PUSH (GOLDBERG - 1986) 270 10.5 M T S M R NG 276 §11 BÀI TỐN TÌM B GHÉP C C I TRÊN TH HAI PHÍA 283 11.1 TH HAI PHÍA (BIPARTITE GRAPH) 283 11.2 BÀI TỐN GHÉP ƠI KHƠNG TR NG VÀ CÁC KHÁI NI M .283 11.3 THU T TOÁN NG M .284 11.4 CÀI T .285 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 TỐN HUNGARI 291 12.1 BÀI TỐN PHÂN CƠNG 291 12.2 PHÂN TÍCH 291 12.3 THU T TOÁN 292 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 301 12.5 NÂNG C P 301 §13 BÀI TỐN TÌM B GHÉP C C I TRÊN TH 307 13.1 CÁC KHÁI NI M 307 13.2 THU T TOÁN EDMONDS (1965) 308 13.3 THU T TOÁN LAWLER (1973) 310 13.4 CÀI T 312 13.5 PH C T P TÍNH TỐN 316 TÀI LI U C THÊM 319 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 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 20 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 95 Hình 30: Tr ng thái tr c g i quy 96 Hình 31: Heap 102 Hình 32: Vun Hình 33: ng 102 o giá tr k[1] cho k[n] xét ph n l i 103 Hình 34: Vun ph n l i thành ng r i l i o tr k[1] cho k[n-1] 103 Hình 35: ánh s bit .106 Hình 36: Thu t toán s p x p tr n .111 vii Hình 37: Máy Pentium 4, 3.2GHz, 2GB RAM t ch m ch p s p x p 108 khoá thu t toán s p x p t t nh t ã [0 7.107] cho dù nh ng c áp d ng 123 Hình 38: Cây nh phân tìm ki m 128 Hình 39: Xóa nút BST 129 Hình 40 Xóa nút ch có m t nhánh BST 130 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 130 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 130 Hình 43: ánh s bit 133 Hình 44: Cây tìm ki m s h c 133 Hình 45: Cây tìm ki m c s 136 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 137 Hình 47: RST ch a khố 2, 4, 5, RST sau lo i b giá tr 138 Hình 48: Cây tìm ki m c s a) Trie tìm ki m c s b) 140 Hình 49: Hàm quy tính s Fibonacci 151 Hình 50: Tính tốn truy v t 154 Hình 51: Truy v t 163 Hình 52: Ví d v mơ hình Hình 53: Phân lo i th 178 th 179 Hình 54 182 Hình 55 183 Hình 56: th ng i 186 Hình 57: Cây DFS 189 Hình 58: Cây BFS 192 Hình 59: th G thành ph n liên thơng G1, G2, G3 c a 193 Hình 60: Kh p c u 193 Hình 61: Liên thơng m nh liên thông y u 194 Hình 62: th Hình 63: n y 195 th vơ h ng bao óng c a 195 Hình 64: Ba d ng cung DFS 199 Hình 65: Thu t toán Tarjan “b ” DFS 201 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) 206 Hình 67: th G m t s ví d khung T1, T2, T3 c a 210 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) 210 nh chi u DFS 213 Hình 70: Phép ánh s ghi nh n cung ng Hình 71: Mơ hình c lên cao nh t 215 th c a toán b y c u 219 Hình 72 220 Hình 73 220 Hình 74 226 viii Hình 75: Phép ánh l i ch s theo th t tôpô 241 Hình 76: Hai g c r1 r2 m i h p nh t chúng .252 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 260 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)) 264 Hình 79: M ng th ng d Hình 80: Lu ng m ng G tr ng t ng lu ng 265 c sau t ng 265 Hình 81: M ng gi c a m ng có nhi u i m phát nhi u i m thu 276 Hình 82: Thay m t nh u b ng hai nh uin, uout 277 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 277 Hình 84: th hai phía 283 Hình 85: th hai phía b ghép M .284 Hình 86: Mơ hình lu ng c a tốn tìm b ghép c c i th hai phía 288 Hình 87: Phép xoay tr ng s c nh .292 Hình 88: Thu t toán Hungari .295 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 302 th G m t b ghép M 307 Hình 91: Phép ch p Blossom .309 Hình 92: N Blossom dò ng xuyên qua Blossom .309 306 Chuyên Enlarge; end; end; procedure Result; {In k t qu } var i, j, Count, W: Integer; f: Text; begin Assign(f, OutputFile); Rewrite(f); WriteLn(f, 'Optimal assignment:'); W := 0; Count := 0; for i := to m begin j := matchX[i]; if c[i, j] < maxC then begin Inc(Count); WriteLn(f, Count:3, ') x[', i, '] - y[', j, '] ', c[i, j]); W := W + c[i, j]; end; end; WriteLn(f, 'Cost: ', W); Close(f); end; begin Enter; Init; Solve; Result; end HSPHN 1999-2004 Lý thuy t th 307 §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 ôi 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 Hình 90: th G m t b ghép M Ta d dàng suy Lê Minh Hồng c tính ch t sau: ng 308 ng m c ng nh Blossom c nh m úng c nh Chuyên 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 tố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 ct x b ng m t ng pha k t thúc c nh nh t c gán nhãn “nh t” (g i t t nh nh t), nh ng nh có th n c t x b ng m t ng pha k t thúc c nh m c gán nhãn “ m” (g i t t nh 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 ngun tính m/nh t Có th ki m ch ng c nh n xét: sau m i phép ch p, c nh m v n c m b o b ghép th m i: HSPHN 1999-2004 Lý thuy t th 309 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 tố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 Lê Minh Hồng dị ng xun qua Blossom Expand 310 Chuyên 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 ó hồn tồ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 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 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 pha lo i S[v] = ng pha k t thúc b ng c nh m, n u không t n t i ng T[v] nh li n tr c v pha 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 Bên c nh hai nhãn S T, m i Nhãn b[v] nh v cịn có thêm: 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 x i Queue dùng V im i Gán S[x] ch a nh ng nh m ch t, ban u ch g m m t nh m nh u, kh i gán b[u] = u match[u] = v i u 0; 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 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): N u v ch a th m: HSPHN 1999-2004 Lý thuy t th 311 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 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 v u x T:1 T:1 Tìm th y ng h p 2: v ch a th m ã ghép Lê Minh Hoàng T:3 u 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 v ng m 312 Chuyên 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 ó xun 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 HSPHN 1999-2004 Lý thuy t th 313 Dòng 1: Ch a hai s n, m l n l d u cách (n t s c nh s th cách nh t m t 1000) 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 nh c a ng trình s a i m t chút mơ hình cài i tìm GMATCH.INP 10 11 12 16 24 28 34 36 56 59 10 78 79 th c GMATCH.OUT 1) 2) 3) 4) 10 5) t d a vào nh n xét: v m t nh m n u ch n u v = x ho c match[v] m t nh nh t, v y m t nh v có ph i nh m hay khơng ta có th ki m tra b ng bi u th c: ki m tra (v = x) or (match[v] 0) and (T[match[v]] 0) = TRUE N u v Các bi n nh c s d ng v i vai trò nh sau: match[v] b[v] m S[v] = match[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 T[v] = n u trình BFS ch a xét t i v nh xu t phát t i v k t thúc b ng c nh nh t, InQueue[v] bi n Boolean, InQueue[v] = True v nh m ã 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 {$MODE DELPHI} (*This program uses 32-bit Integer [-231 231 - 1]*) program MatchingInGeneralGraph; const InputFile = 'GMATCH.INP'; OutputFile = 'GMATCH.OUT'; max = 1000; 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; f: Text; begin Assign(f, InputFile); Reset(f); Lê Minh Hoàng c y vào Queue 314 Chuyên 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 c kh i t o 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 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 InPath[p] := True; { ánh d u nút ó} if p = start then Break; {N u ã truy v n n i xu t phát p := T[match[p]]; {N u ch a v n start truy lùi ti p until False; nh m p, q} t p q} y t ng t c d ng} hai b c, theo c nh truy v t} m r i theo c nh nh t} HSPHN 1999-2004 Lý thuy t th 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 q := T[match[q]]; until False; FindCommonAncestor := q; {Ghi nh n nh c s m i} end; 315 ng pha c a p d ng ngay} 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] c kh i t o ch a b ánh d u} NewBase := FindCommonAncestor(p, q); {xác nh nút c s } ResetTrace(p); ResetTrace(q); {Gán l i nhãn} 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] cho nh 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 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; {Rút m t nh m u kh i hàng i} {Xét nh ng nh v k u qua m t c nh nh t mà v không n m blossom v i u} for v := to n if (a[u, v]) and (match[u] v) and (b[u] b[v]) then if (v = start) or (match[v] 0) and (T[match[v]] 0) then {N u v nh m} BlossomShrink(u, v) {thì gán l i v t, ch p blossom } else if T[v] = then {N u v nh nh t ch a th m t i} if match[v] = then {N u v ch a ghép ngh a tìm c ng m k t thúc v, thoát} begin T[v] := u; finish := v; Exit; end else {N u v ã ghép ghi v t ng i, th m v, th m c match[v] y match[v] vào Queue} begin T[v] := u; Push(match[v]); Lê Minh Hoàng 316 Chuyên 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; 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; 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 in l p c nh (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ó 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) HSPHN 1999-2004 Lý thuy t th 317 Cho n nay, ph ng pháp t t nh t bi t n c a Micali Vazizani (1980), có th tham kh o tài li u khác Lê Minh Hồng gi i tốn tìm b ghép t ng qt ph c t p tính tốn O th c n.m B n có 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 toá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 u Title: The Art of Computer Programming, 3rd edition Author: Donald E Knuth Volume 1: Fundamental Algorithms, ISBN: 0-201-89683-4 Volume 2: Seminumerical Algorithms, ISBN: 0-201-89684-2 Volume 3: Sorting and Searching, ISBN: 0-201-89685-0 Volume 4: Combinatorial Algorithms (in preparation) Volume 5: Syntactic Algorithms (in preparation) Publisher: Addison-Wesley, 1998 Title: Introduction to Algorithms, 2nd edition, ISBN: 0262032937 Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest Publisher: The MIT Press, 2001 Ngoài b n có th tham kh o thêm nh ng cu n sách sau ây: Alfred V Aho, Jeffrey D Ullman, John E Hopcroft Data Structures and Algorithms, ISBN: 0201000237, Addison Wesley, 1983 Robert Sedgewick Algorithms 2nd edition, ISBN: 0201066734, Addison Wesley, 1988 Mikhail J Atallah Ed Algorithms and Theory of Computation Handbook, ISBN: 0849326494, CRC Press, 1998 ... Nam - Tây B c ( N-TB) b t k s i qua m t s ô, ó có tính ch t: Hàng - C t = C (Const) V i m i ng chéo N-TB ta có h ng s C v i m t h ng s C: - n C có th ng chéo N- TB t - n ánh ch s cho Lê Minh. .. n x[k-1] x[k] - n-1 … x[i] n-k+i … x[1] T n - k + ó suy x[i-1] + x[i] n - k + i (1 i k) ây ta gi thi t có thêm m t s x[0] = xét i = Nh v y ta s xét t t c cách ch n x[1] t (=x[0] + 1) n n - k +... 231 242 344 c TOURISM.OUT 1-> 3-> 2-> 4-> 1 Cost: P_1_04_1.PAS * K thu t nhánh c n dùng cho toán ng i du l ch {$MODE DELPHI} (*This program uses 32-bit Integer [-2 31 231 - 1]*) program TravellingSalesman;