giải thuật và lập trình

316 76 0
giải thuật và lập trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 27/12/2019, 22:59

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan