Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 240 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
240
Dung lượng
1,74 MB
Nội dung
Hồ sĩ đàm (Chủ biên) đỗ đức đông lê minh hoàng nguyễn hùng tài liệu giáo khoa chuyên tin Nhà xuất giáo dục việt nam Công ty Cổ phần dịch vụ xuất Giáo dục H Nội - Nh xuất Giáo dục Việt Nam giữ quyền công bố tác phẩm 349-2009/CXB/43-644/GD M sè : 8I746H9 L I NÓI ð U B Giáo d c ðào t o ñã ban hành chương trình chuyên tin h c cho l p chuyên 10, 11, 12 D a theo chuyên ñ chuyên sâu chương trình nói trên, tác gi biên so n b sách chuyên tin h c, bao g m v n ñ b n nh t v c u trúc d li u, thu t toán cài đ t chương trình B sách g m ba quy n, quy n 1, C u trúc m i quy n bao g m: ph n lí thuy t, gi i thi u khái ni m b n, c n thi t tr c ti p, thư ng dùng nh t; ph n áp d ng, trình bày tốn thư ng g p, cách gi i cài ñ t chương trình; cu i t p Các chuyên ñ b sách ñư c l a ch n mang tính h th ng t b n ñ n chuyên sâu V i tr i nghi m nhi u năm tham gia gi ng d y, b i dư ng h c sinh chuyên tin h c c a trư ng chuyên có truy n th ng uy tín, tác gi l a ch n, biên so n n i dung b n, thi t y u nh t mà ñã s d ng ñ d y h c v i mong mu n b sách ph c v không ch cho giáo viên h c sinh chuyên PTTH mà c cho giáo viên, h c sinh chuyên tin h c THCS làm tài li u tham kh o cho vi c d y h c c a V i kinh nghi m nhi u năm tham gia b i dư ng h c sinh, sinh viên tham gia kì thi h c sinh gi i Qu c gia, Qu c t H i thi Tin h c tr Toàn qu c, Olympiad Sinh viên Tin h c Tồn qu c, Kì thi l p trình viên Qu c t khu v c ðông Nam Á, tác gi ñã l a ch n gi i thi u t p, l i gi i có đ nh hư ng ph c v cho khơng ch h c sinh mà c sinh viên làm tài li u tham kh o tham gia kì thi L n ñ u t p sách ñư c biên so n, th i gian trình đ có h n ch nên ch c ch n cịn nhi u thi u sót, tác gi mong nh n đư c ý ki n đóng góp c a b n ñ c, ñ ng nghi p, sinh viên h c sinh ñ b sách ñư c ngày hoàn thi n Các tác gi Chuyên ñ KI U D LI U TR U TƯ NG VÀ C U TRÚC D LI U Ki u d li u tr u tư ng m t mơ hình tốn h c v i nh ng thao tác đ nh nghĩa mơ hình ñó Ki u d li u tr u tư ng có th khơng t n t i ngơn ng l p trình mà ch dùng đ t ng qt hóa ho c tóm lư c nh ng thao tác s ñư c th c hi n d li u Ki u d li u tr u tư ng ñư c cài ñ t máy tính b ng c u trúc d li u: Trong k thu t l p trình c u trúc (Structural Programming), c u trúc d li u bi n v i th t c hàm thao tác bi n Trong k thu t l p trình hư ng đ i tư ng (ObjectOriented Programming), c u trúc d li u ki n trúc th b c c a l p, thu c tính phương th c tác đ ng lên đ i tư ng hay m t vài thu c tính c a đ i tư ng Trong chương này, s kh o sát m t vài ki u d li u tr u tư ng cách cài ñ t chúng b ng c u trúc d li u Nh ng ki u d li u tr u tư ng ph c t p s đư c mơ t chi ti t t ng thu t toán m i th y c n thi t Danh sách 1.1 Khái ni m danh sách Danh sách m t t p s p th t ph n t m t ki u ð i v i danh sách, ngư i ta có m t s thao tác: Tìm m t ph n t danh sách, chèn m t ph n t vào danh sách, xóa m t ph n t kh i danh sách, s p x p l i ph n t danh sách theo m t tr t t v.v… Vi c cài đ t m t danh sách máy tính t c tìm m t c u trúc d li u c th mà máy tính hi u đư c ñ lưu ph n t c a danh sách ñ ng th i vi t ño n chương trình mơ t thao tác c n thi t đ i v i danh sách Vì danh sách m t t p s p th t ph n t ki u, ta ký hi u ˠ˗ˬ˥˭˥Jˮ ki u d li u c a ph n t danh sách, cài ñ t c th , ˠ˗ˬ˥˭˥Jˮ có th b t c ki u d li u ñư c chương trình d ch ch p nh n (S nguyên, s th c, ký t , …) 1.2 Bi u di n danh sách b ng m ng Khi cài ñ t danh sách b ng m ng m t chi u , ta c n có m t bi n nguyên J lưu s ph n t hi n có danh sách N u m ng đư c ñánh s b t ñ u t ph n t danh sách ñư c c t gi m ng b ng ph n t ñư c ñánh s t t i J: ˓ I{ŵ J{ a) Truy c p ph n t m ng Vi c truy c p m t ph n t v trí J m ng có th th c hi n r t d dàng qua ph n t I Vì ph n t c a m ng có kích thư c b ng ñư c lưu tr liên t c b nh , vi c truy c p m t ph n t ñư c th c hi n b ng m t phép tốn tính đ a ch ph n t có th i gian tính tốn h ng s Vì v y n u cài đ t b ng m ng, vi c truy c p m t ph n t danh sách v trí b t kỳ có đ ph c t p ß{ŵ{ b) Chèn ph n t vào m ng ð chèn m t ph n t ˰ vào m ng t i v trí J, trư c h t ta d n t t c ph n t t v trí J t i t i v trí J v sau m t v trí (t o “ch tr ng” t i v trí J), đ t giá tr ˰ vào v trí J, tăng s ph n t c a m ng lên procedure Insert(p: Integer; const v: TElement); //Th t c chèn ph n t v vào v trí p var i: Integer; begin for i := n downto p a[i + 1] := a[i]; a[p] := v; n := n + 1; end; Trư ng h p t t nh t, v trí chèn n m sau ph n t cu i c a danh sách (J J - ŵ), th i gian th c hi n c a phép chèn ß{ŵ{ Trư ng h p x u nh t, ta c n chèn t i v trí 1, th i gian th c hi n c a phép chèn ß{J{ Cũng d dàng ch ng minh ñư c r ng th i gian th c hi n trung bình c a phép chèn ß{J{ c) Xóa ph n t kh i m ng ð xóa m t ph n t t i v trí J c a m ng mà v n gi nguyên th t ph n t l i: Trư c h t ta ph i d n t t c ph n t t v trí J - ŵ t i J lên trư c m t v trí (thơng tin c a ph n t th J b ghi đè), sau gi m s ph n t c a m ng (J) ñi procedure Delete(p: Integer); //Th t c xóa ph n t t i v trí p var i: Integer; begin for i := p to n - a[i] := a[i + 1]; n := n - 1; end; Trư ng h p t t nh t, v trí xóa n m cu i danh sách (J J{, th i gian th c hi n c a phép xóa ß{ŵ{ Trư ng h p x u nh t, ta c n xóa t i v trí 1, ñó th i gian th c hi n c a phép xóa ß{J{ Cũng d dàng ch ng minh ñư c r ng th i gian th c hi n trung bình c a phép xóa ß{J{ Trong trư ng h p c n xóa m t ph n t mà khơng c n trì th t c a ph n t khác, ta ch c n ñưa giá tr ph n t cu i vào v trí c n xóa r i gi m s ph n t c a m ng (J) ñi Khi th i gian th c hi n c a phép xóa ch ß{ŵ{ 1.3 Bi u di n danh sách b ng danh sách n i ñơn Danh sách n i ñơn (Singly-linked list) g m nút ñư c n i v i theo m t chi u M i nút m t b n ghi (record) g m hai trư ng: Trư ng ˩J˦J ch a giá tr lưu nút Trư ng ˬ˩J˫ ch a liên k t (con tr ) t i nút k ti p, t c ch a m t thơng tin đ đ bi t nút k ti p nút danh sách nút nào, trư ng h p nút cu i (khơng có nút k ti p), trư ng liên k t ˩J˦J ˬ˩J˫ ñư c gán m t giá tr ñ c bi t, ch ng h n tr J˩ˬ type PNode = ^TNode; //Ki u tr t i m t nút TNode = record; //Ki u bi n đ ng ch a thơng tin m t nút info: TElement; link: PNode; end; Nút đ u tiên danh sách (˨˥Iˤ) đóng vai trị quan tr ng danh sách n i đơn ð t danh sách n i ñơn, ta b t ñ u t nút ñ u tiên, d a vào trư ng liên k t ñ ñi sang nút k ti p, ñ n g p giá tr ñ c bi t (duy t qua nút cu i) d ng l i a ˨˥Iˤ b c d e Hình 1.1 Danh sách n i đơn a) Truy c p ph n t danh sách n i n B n thân danh sách n i ñơn ñã m t ki u d li u tr u tư ng ð cài ñ t ki u d li u tr u tư ng này, có th dùng m ng nút (trư ng ˬ˩J˫ ch a ch s c a nút k ti p) ho c bi n c p phát ñ ng (trư ng ˬ˩J˫ ch a tr t i nút k ti p) Tuy nhiên c u trúc n i đơn, vi c xác ñ nh ph n t ñ ng th J danh sách b t bu c ph i t t ñ u danh sách qua J nút, vi c m t th i gian trung bình ß{J{, t không hi u qu thao tác m ng Nói cách khác, danh sách n i ñơn ti n l i cho vi c truy c p tu n t không hi u qu n u th c hi n nhi u phép truy c p ng u nhiên b) Chèn ph n t vào danh sách n i n ð chèn thêm m t nút ch a giá tr ˰ vào v trí c a nút J danh sách n i ñơn, trư c h t ta t o m t nút m i ˚˥˱˚Jˤ˥ ch a giá tr ˰ cho nút liên k t t i J N u J ñang nút ñ u tiên c a danh sách (˨˥Iˤ) c p nh t l i ˨˥Iˤ b ng ˚˥˱˚Jˤ˥, n u J khơng ph i nút đ u tiên c a danh sách, ta tìm nút J nút đ ng li n trư c nút J ch nh l i liên k t: J liên k t t i ˚˥˱˚Jˤ˥ thay liên k t t i th ng J (h.1.2) a b a ˨˥Iˤ b d J ˨˥Iˤ c e J c J d ˰ ˚˥˱˚Jˤ˥ e J Hình 1.2 Chèn ph n t vào danh sách n i ñơn procedure Insert(p: PNode; const v: TElement); //Th t c chèn ph n t v vào v trí nút p var NewNode, q: PNode; begin New(NewNode); NewNode^.info := v; NewNode^.link := p; if head = p then head := NewNode else begin q := head; while q^.link ≠ p q := q^.link; q^.link := NewNode; end; end; Vi c ch nh l i liên k t phép chèn ph n t vào danh sách n i ñơn m t th i gian ß{ŵ{, nhiên vi c tìm nút đ ng li n trư c nút J yêu c u ph i t t ñ u danh sách, vi c m t th i gian trung bình ß{J{ V y phép chèn m t ph n t vào danh sách n i ñơn m t th i gian trung bình ß{J{ đ th c hi n c) Xóa ph n t kh i danh sách n i n: ð xóa nút J kh i danh sách n i ñơn, g i J˥˲ˮ nút ñ ng li n sau J danh sách Xét hai trư ng h p: N u J nút ñ u tiên danh sách ˨˥Iˤ J˥˲ˮ J ta ñ t l i ˨˥Iˤ b ng N u J khơng ph i nút đ u tiên danh sách, tìm nút J nút đ ng li n trư c nút J ch nh l i liên k t: J liên k t t i J˥˲ˮ thay liên k t t i J (h.1.3) Vi c cu i hu nút J procedure Delete(p: PNode); //Th t c xóa nút p c a danh sách n i ñơn var next, q: PNode; begin next := p^.link; if p = head then head := next else begin q := head; while q^.link p q := q^.link; q^.link := next; end; Dispose(p); end; a b c d ˨˥Iˤ J J J˥˲ˮ a b d ˨˥Iˤ J e J˥˲ˮ e Hình 1.3 Xóa ph n t kh i danh sách n i ñơn Cũng gi ng phép chèn, phép xóa m t ph n t kh i danh sách n i ñơn m t th i gian trung bình ß{J{ đ th c hi n Trên mơ t thao tác v i danh sách bi u di n dư i d ng danh sách n i ñơn bi n ñ ng Chúng ta có th cài đ t danh sách n i ñơn b ng m t m ng, m i nút ch a m t ph n t c a m ng trư ng liên k t ˬ˩J˫ ch s c a nút k ti p Khi m i thao tác chèn/xóa ph n t ñư c th c hi n tương t trên: const max = ; //S ph n t c c ñ i type TNode = record 10 procedure MaxFlowByScaling; begin f := «Lu ng 0»; k := C; //k s c ch a l n nh t c a m t cung E while k ≥ begin while «Tìm đư c đư ng tăng lu ng P có giá tr th ng dư ≥ k» «Tăng lu ng d c theo đư ng P»; k := k div 2; end; end; d) Ch ng minh r ng bư c vào m i lư t l p c a vòng l p: while k ≥ Lưu lư ng c a lát c t h p nh t m ng th ng dư ˙ không vư t Ŷ˫É˗É e) Ch ng minh r ng m i lư t l p c a vòng l p: while k ≥ Vòng l p while bên th c hi n {˗{ l n v i m i giá tr c a ˫ f) Ch ng minh r ng thu t tốn (maximum flow by scaling) có th cài đ t đ tìm lu ng c c đ i ˙ th i gian {É˗É$ ˕{ B ghép c c ñ i ñ th hai phía 4.1 ð th hai phía ð th vơ hư ng ˙ {ˢ ˗{ ñư c g i ñ th hai phía n u t p ñ nh ˢ c a có th chia làm hai t p r i nhau: I I cho m i c nh c a ñ th ñ u n i m t ñ nh thu c I v i m t ñ nh thu c I Khi ngư i ta cịn ký hi u ˙ {I I ˗{ ð thu n tiên trình bày, ta g i ñ nh thu c I I_ñ nh ñ nh thu c I I_đ nh 226 I I Hình 2.12 ð th hai phía M t đ th vơ hư ng ñ th hai phía n u ch n u t ng thành ph n liên thơng c a đ th hai phía ð ki m tra m t đ th vơ hư ng liên thơng có ph i đ th hai phía hay khơng, ta có th s d ng m t thu t tốn tìm ki m ñ th (BFS ho c DFS) b t ñ u t m t ñ nh J b t kỳ ð t: I ɦ t p ñ nh ñ n ñư c t J qua m t s ch n c nh I ɦ t p ñ nh ñ n ñư c t J qua m t s l c nh N u t n t i c nh c a ñ th n i hai ñ nh I ho c hai đ nh I đ th cho khơng ph i đ th hai phía, ngư c l i ñ th ñã cho ñ th hai phía v i cách phân ho ch t p ñ nh thành hai t p I I ð th hai phía g p r t nhi u mơ hình th c t Ch ng h n quan h hôn nhân gi a t p nh ng ngư i đàn ơng t p nh ng ngư i ñàn bà, vi c sinh viên ch n trư ng, th y giáo ch n ti t d y th i khoá bi u v.v… 4.2 Bài tốn tìm b ghép c c đ i đ th hai phía Cho đ th hai phía ˙ {I I ˗{ M t b ghép (matching) c a ˙ m t t p c nh đơi m t khơng có đ nh chung Có th coi m t b ghép m t t p H ʃ ˗ cho ñ th {I I H{, m i đ nh có b c khơng q V n đ đ t tìm m t b ghép l n nh t (maximum matching) (có nhi u c nh nh t) đ th hai phía cho trư c 4.3 Mơ hình lu ng ð nh hư ng c nh c a ˙ thành cung t I sang I Thêm vào ñ nh phát gi J cung n i t J t i I_ñ nh, thêm vào ñ nh thu gi ˮ cung n i t 227 I_ñ nh t i ˮ S c ch a c a t t c cung ñư c ñ t b ng 1, ta ñư c m ng ˙ Xét m t lu ng m ng ˙ có lu ng cung s ngun, có th th y r ng nh ng cung có lu ng b ng t I sang I s tương ng v i m t b ghép ˙ Bài tốn tìm b ghép c c đ i ˙ có th gi i quy t b ng cách tìm lu ng nguyên c c ñ i ˙ 2 3 I J I ˮ Hình 2.13 Mơ hình lu ng c a tốn tìm b ghép c c đ i đ th hai phía Chúng ta s phân tích m t s đ c ñi m c a ñư ng tăng lu ng trư ng h p đ tìm m t cách cài ñ t ñơn gi n Xét ñ th hai phía ˙ {I I ˗{ m t b ghép H ˙ Nh ng ñ nh thu c H g i nh ng ñ nh ñã ghép (matched vertices), nh ng đ nh khơng thu c H g i nh ng ñ nh chưa ghép (unmached vertices) Nh ng c nh thu c H g i nh ng c nh ñã ghép, nh ng c nh khơng thu c H đư c g i nh ng c nh chưa ghép N u ñ nh hư ng l i nh ng c nh c a ñ th thành cung: Nh ng c nh chưa ghép ñ nh hư ng t I sang I, nh ng c nh ñã ghép ñ nh hư ng ngư c l i t I v I Trên ñ th ñ nh hư ng ñó, m t ñư ng ñi ñư c g i ñư ng pha (alternating path) m t ñư ng ñi t m t I _ñ nh chưa ghép t i m t I_ñ nh chưa ghép g i m t ñư ng m (augmenting path) D c m t ñư ng pha, c nh ñã ghép chưa ghép xen k ðư ng m m t ñư ng pha, ñi qua m t s l c nh, ñó s c nh chưa ghép nhi u s c nh ghép m t c nh Ví d v i đ th hai phía hình 2.14 m t b ghép {{˲# ˳# { {˲$ ˳$ {{ ðư ng ñi ˲% ˳$ ˲$ ˳# m t ñư ng pha, ñư ng ñi ˲% ˳$ ˲$ ˳# ˲# ˳% m t ñư ng m 228 1 2 3 I I Hình 2.14 ð th hai phía c nh đư c ñ nh hư ng theo m t b ghép ðư ng m th c ch t ñư ng tăng lu ng v i giá tr th ng dư mơ hình lu ng ð nh lý 3-11 (m i quan h gi a lu ng c c ñ i, ñư ng tăng lu ng lát c t h p nh t) ñã ch r ng ñi u ki n c n ñ ñ m t b ghép H b ghép c c ñ i khơng t n t i đư ng m ng v i H N u t n t i ñư ng m ˜ ng v i b ghép H, ta m r ng b ghép b ng cách: d c ñư ng ˜ lo i b nh ng c nh ñã ghép kh i H thêm nh ng c nh chưa ghép vào H B ghép m i thu đư c s có l c lư ng nhi u b ghép cũ ñúng m t c nh ðây th c ch t phép tăng lu ng d c đư ng ˜ mơ hình lu ng 4.4 Thu t tốn đư ng m T mơ hình lu ng c a tốn, có th xây d ng đư c thu t tốn tìm b ghép c c đ i d a ch tìm đư ng m tăng c p: Thu t toán kh i t o m t b ghép b t kỳ trư c bư c vào vịng l p T i m i bư c l p, ñư ng m (th c ch t m t ñư ng ñi t m t I_ñ nh chưa ghép t i m t I_ñ nh chưa ghép) ñư c tìm b ng BFS ho c DFS b ghép s ñư c m r ng d a đư ng m tìm đư c M := «M t b ghép b t kỳ, ch ng h n: »; while «Tìm đư c đư ng m P» begin «D c đư ng P: - Lo i b nh ng c nh ñã ghép kh i M - Thêm nh ng c nh chưa ghép vào M » end; 229 Ví d v i đ th hình 2.14 b ghép H {{˲# ˳# { {˲$ ˳$ {{, thu t tốn s tìm đư c đư ng m : ˲% ˳$ ˲$ ˳# ˲# ˳% D c ñư ng m này, ta lo i b hai c nh {˳$ ˲$ { {˳# ˲# { kh i b ghép thêm vào b ghép ba c nh {˲% ˳$ {, {˲$ ˳# {, {˲# ˳% {, ñư c b ghép m i c nh ð th v i b ghép m i khơng cịn đ nh chưa ghép (khơng cịn đư ng m ) nên b ghép c c ñ i (h.2.15) 1 1 2 2 3 3 I I I I Hình 2.15 M r ng b ghép 4.5 Cài đ t Chúng ta s cài đ t thu t tốn tìm b ghép c c đ i đ th hai phía ˙ {I I ˗{, ÉIÉ J, ÉIÉ J É˗É ˭ Các I_ñ nh ñư c ñánh s t t i J I_ñ nh ñư c ñánh s t t i J Khn d ng Input/Output sau: Input Dịng ch a ba s nguyên dương J J ˭ l n lư t s I_ñ nh, s I_ñ nh s c nh c a đ th hai phía {J J ŵŴ& ˭ ŵŴ { ˭ dòng ti p theo, m i dòng ch a hai s nguyên dương ˩ ˪ tương ng v i m t c nh ˲ ˳ c a ñ th Output B ghép c c ñ i ñ th 230 Sample Input Sample Output 3 1: x[2] - y[1] 2: x[3] - y[2] 2 3: x[1] - y[3] 2 3 I 1 I 1 a) Bi u di n th hai phía b ghép ð th hai phía ˙ {I I ˗{ s đư c bi u di n b ng cách danh sách k c a I_ñ nh C th ta s s d ng m ng ˨˥Iˤ{ŵ J{ v i ph n t ban ñ u ñư c kh i t o b ng 0, m ng Iˤ˪{ŵ ˭{ m ng ˬ˩J˫{ŵ ˭{ Danh sách k ñư c xây d ng q trình đ c danh sách c nh: m i ñ c m t c nh {˲ ˳{ ta gán Iˤ˪{˩{ ɦ ˳ , ñ t ˬ˩J˫{˩{ ɦ ˨˥Iˤ{˲{ sau c p nh t l i ˥ ˨˥Iˤ{˲{ ɦ ˩ Khi ñ c xong danh sách c nh danh sách k đư c xây d ng xong, đ t I_ñ nh k v i m t ñ nh ˲ I, ta có th s d ng thu t tốn sau: i := head[x]; //T đ u danh sách móc n i ñ nh k x while i ≠ begin «X lý đ nh adj[i]»; i := link[i]; //Nh y sang ph n t k ti p danh sách móc n i end; B ghép ñ th hai phía ñư c bi u di n b i m ng ˭IˮI˨{ŵ J˳{, ˭IˮI˨{˪{ ch s c a I_ñ nh ghép v i ñ nh ˳ N u ˳ ñ nh chưa ghép, ta gán ˭IˮI˨{˪{ ɦ Ŵ b) Tìm ng m ðư ng m th c ch t m t ñư ng ñi t m t I_ñ nh chưa ghép t i m t I_ñ nh chưa ghép ñ th đ nh hư ng Ta s tìm đư ng m t i m i bư c b ng thu t tốn DFS: 231 B t đ u t m t ñ nh ˲ I chưa ghép, trư c h t ta ñánh d u I_ñ nh b ng m ng I˰I˩ˬ{ŵ J{ I˰I˩ˬ{˪{ n u ñ nh ˳ I chưa thăm I˰I˩ˬ{˪{ n u ñ nh ˳ I ñã thăm (ch c n ñánh d u I_ñ nh) Thu t toán DFS ñ tìm ñư ng m xu t phát t ˲ ñư c th c hi n b ng m t th t c ñ quy ˢ˩J˩ˮ{˲{, th t c s quét t t c nh ng ñ nh ˳ I chưa thăm n i t I (dĩ nhiên qua m t c nh chưa ghép), v i m i xét ñ n m t ñ nh ˳ I, trư c h t ta ñánh d u thăm ˳ Sau đó: N u ˳ ghép, d a vào s ki n t ˳ ch ñi ñ n ñư c ˭IˮI˨{˳{ qua m t c nh ñã ghép hư ng t I v I, l i g i ñ quy ˢ˩J˩ˮ{˭IˮI˨{˳{{ ñư c th c hi n ñ thăm ln đ nh ˭IˮI˨{˳{ I (thăm li n hai bư c) Ngư c l i n u ˳ chưa ghép, t c thu t tốn DFS tìm đư c ñư ng m k t thúc ˳, ta thoát kh i dây chuy n đ quy Q trình dây chuy n ñ quy th c ch t l n ngư c ñư ng m , ta s l i d ng q trình đ m r ng b ghép d a ñư ng m ð thu t tốn ho t đ ng hi u qu hơn, ta s d ng liên ti p pha x lý lô: Ký hi u I t p I_ñ nh chưa ghép, m i pha s c g ng m r ng b ghép d a khơng ch m t mà nhi u đư ng m khơng có đ nh chung xu t phát t ñ nh khác thu c I C th m t pha s kh i t o m ng ñánh d u I˰I˩ˬ{ŵ J{ b i giá tr , sau qt t t c nh ng đ nh ˲ I , th tìm đư ng m xu t phát t ˲ m r ng b ghép n u tìm đư ng m Trong m t pha có th có nhi u I_đ nh đư c ghép thêm procedure Visit(x X); //Thu t toán DFS begin for y: (x, y) E //Quét Y_đ nh k x if avail[y] then //y chưa thăm, ý (x, y) ch c ch n c nh chưa ghép begin avail[y] := False; //Đánh d u thăm y if match[y] = then Found := True //y chưa ghép, d ng c báo tìm th y đư ng m else Visit(match[y]); //y ghép, g i đ quy ti p t c DFS if Found then // Ngay đư ng m đư c tìm th y begin match[y] := x; //Ch nh l i b ghép theo đư ng m 232 Exit; //Thốt ln, l nh Exit đ t s thoát c dây chuy n đ quy end; end; end; begin //Thu t tốn tìm b ghép c c đ i đ th hai phía «Kh i t o m t b ghép b t kỳ, ch ng h n »; X* := «T p ñ nh chưa ghép»; repeat //L p pha x lý theo lô Old := |X*|; //Lưu s đ nh chưa ghép b t đ u pha for y Y avail[y] := True; //ðánh d u m i Y_ñ nh chưa thăm for x X* begin Found := False; //C báo chưa tìm th y đư ng m Visit(x); //Tìm đư ng m b ng DFS if Found then X* := X* - {x}; //x ñã ñư c ghép, lo i b x kh i X* end; until |X*| = Old; //L p cho t i khơng th ghép thêm end; BMATCH.PAS Tìm b ghép c c đ i đ th hai phía {$MODE OBJFPC} program MaximumBipartiteMatching; const maxN = 10000; maxM = 1000000; var p, q, m: Integer; adj: array[1 maxM] of Integer; link: array[1 maxM] of Integer; head: array[1 maxN + 1] of Integer; match: array[1 maxN] of Integer; avail: array[1 maxN] of Boolean; List: array[1 maxN] of Integer; nList: Integer; procedure Enter; //Nh p d li u var i, x, y: Integer; begin 233 ReadLn(p, q, m); FillChar(head[1], p * SizeOf(head[1]), 0); for i := to m begin ReadLn(x, y); //Đ c m t c nh (x, y), đưa y vào danh sách k c a x adj[i] := y; link[i] := head[x]; head[x] := i; end; end; procedure Init; //Kh i t o b ghép r ng var i: Integer; begin FillChar(match[1], q * SizeOf(match[1]), 0); for i := to p List[i] := i; //M ng List ch a nList X_ñ nh chưa ghép nList := p; end; procedure SuccessiveAugmentingPaths; var Found: Boolean; Old, i: Integer; procedure Visit(x: Integer); //Thu t toán DFS t x∈X var i, y: Integer; begin i := head[x]; //T đ u danh sách k c a x while i begin y := adj[i]; //Xét m t đ nh y∈Y k x if avail[y] then //y chưa thăm, hi n nhiên (x, y) c nh chưa ghép begin avail[y] := False; //Đánh d u thăm y if match[y] = then Found := True //y chưa ghép báo hi u tìm th y đư ng m else Visit(match[y]); //Thăm match[y]∈X (thăm li n bư c) if Found then //Tìm th y đư ng m begin match[y] := x; //Ch nh l i b ghép 234 Exit; //Thoát dây chuy n đ quy end; end; i := link[i]; //Chuy n sang ñ nh k ti p danh sách ñ nh k x end; end; begin repeat Old := nList; //Lưu l i s X_đ nh chưa ghép FillChar(avail[1], q * SizeOf(avail[1]), True); for i := nList downto begin Found := False; Visit(List[i]); //C ghép List[i] if Found then //N u ghép đư c begin //Xóa List[i] kh i danh sách X_đ nh chưa ghép List[i] := List[nList]; Dec(nList); end; end; until Old = nList; //Không th ghép thêm X_đ nh n a end; procedure PrintResult; //In k t qu var j, k: Integer; begin k := 0; for j := to q if match[j] then begin Inc(k); WriteLn(k, ': x[', match[j], '] - y[', j, ']'); end; end; begin Enter; Init; SuccessiveAugmentingPath; PrintResult; 235 end N u đ th có J đ nh (J J - J) ˭ c nh, m ng ñánh d u I˰I˩ˬ{ŵ J{ ch ñư c kh i t o m t l n pha, th i gian th c hi n c a m t pha s b ng {J - ˭{ (suy t th i gian th c hi n gi i thu t c a DFS) Các pha s ñư c th c hi n l p cho t i I ho c m t pha th c hi n xong mà khơng ghép thêm đư c đ nh Thu t tốn c n khơng q J l n th c hi n pha x lý lô, nên th i gian th c hi n gi i thu t tìm b ghép c c đ i đ th hai phía {J$ - J˭{ trư ng h p x u nh t Còn trư ng h p t t nh t, ta có th tìm đư c b ghép c c ñ i ch qua m t lư t th c hi n pha x lý lô, t c b ng th i gian th c hi n gi i thu t DFS C n lưu ý r ng ñây ch nh ng ñánh giá l n v c n c a th i gian th c hi n Thu t toán ch y r t nhanh th c t hi n t i chưa có đánh giá ch t Ý tư ng tìm m t lúc nhi u đư ng m khơng có đ nh chung đư c nghiên c u toán lu ng c c ñ i b i Dinic[10] D a ý tư ng này, Hopcroft Karp[21] tìm thu t tốn tìm b ghép c c đ i ñ th hai phía th i gian Ә ÉˢÉÉ˗Éә Thu t toán Hopcroft-Karp trư c h t s d ng BFS ñ phân l p ñ nh theo ñ dài ñư ng ñi ng n nh t sau m i s d ng DFS r ng BFS đ x lý lơ tương t cách làm c a Bài t p 2.35 Có J th J vi c M i th cho bi t có th làm đư c nh ng vi c nào, m i vi c giao cho m t th th c hi n s đư c hồn thành xong ñơn v th i gian T i m t th i ñi m, m i th ch th c hi n không m t vi c Hãy phân công th làm công vi c cho: M i vi c ch giao cho ñúng m t th th c hi n Th i gian hoàn thành t t c công vi c nh nh t Chú ý th có th th c hi n song song cơng vi c đư c giao, vi c c a ngư i n y làm, không nh hư ng t i ngư i khác 236 3.36 M t b ghép H ñ th hai phía g i t i đ i n u vi c b sung thêm b t c c nh vào H s làm cho H khơng cịn b ghép n a a) Ch m t ví d v b ghép t i đ i khơng b ghép c c ñ i ñ th hai phía b) Tìm thu t tốn {É˗É{ đ xác ñ nh m t b ghép t i ñ i đ th hai phía c) Ch ng minh r ng n u ˓ ˔ hai b ghép t i ñ i m t ñ th hai phía É˓É ŶÉ˔É É˔É ŶÉ˓É T ch r ng n u thu t tốn đư ng m đư c kh i t o b ng m t b ghép t i ñ i s lư t tìm đư ng m gi m ñi nh t m t n a so v i vi c kh i t o b ng b ghép r ng 3.37 (Ph ñ nh – Vertex Cover) Cho đ th hai phía ˙ {I I ˗{ Bài tốn đ t ch n m t t p ˕ g m nh t ñ nh cho m i c nh ˗ ñ u liên thu c v i nh t m t đ nh thu c ˕ Bài tốn tìm ph ñ nh nh nh t ñ th t ng quát NP-ñ y ñ , hi n t i chưa có thu t tốn đa th c đ gi i quy t Tuy v y ñ th hai phía, ph đ nh nh nh t có th tìm ñư c d a b ghép c c ñ i D a vào mơ hình lu ng c a tốn b ghép c c đ i, gi s cung {I I{ có s c ch a - , cung {J I{ {I ˮ{ có s c ch a G i {˟ ˠ{ lát c t h p nh t c a m ng ð t ˕ {˲ ˠ{ {˳ ˟{ a) Ch ng minh r ng ˕ m t ph ñ nh b) Ch ng minh r ng ˕ ph ñ nh nh nh t c) Gi s ta tìm đư c H b ghép c c ñ i đ th hai phía, ch c ch n khơng cịn t n t i đư ng m tương ng v i b ghép H ð t: I I ˳ {˲ I ˲ I chưa ghép ˲ ñ n ñư c ˳ qua m t ñư ng pha I ˲ ñã ghép ñ nh ghép v i ˲ không thu c I { Ch ng minh r ng {I I { lát c t h p nh t d) Xây d ng thu t tốn tìm ph ñ nh nh nh t ñ th hai phía d a thu t tốn tìm b ghép c c ñ i 3.38 Cho H m t b ghép đ th hai phía ˙ {I I ˗{ G i ˫ s I_ñ nh chưa ghép Ch ng minh r ng ba m nh ñ sau ñây tương ñương: 237 H b ghép c c đ i ˙ khơng có đư ng m tương ng v i b ghép H T n t i m t t p ˓ c a I cho É˚{˓{É É˓É ˫ ñây ˚{˓{ t p I_ñ nh k v i m t ñ nh ñó ˓ (G i ý: Ch n ˓ t p I_ñ nh ñ n ñư c t m t I_ñ nh chưa ghép b ng m t ñư ng pha) 2.39 (ð nh lý Hall) Cho ˙ {I I ˗{ đ th hai phía có ÉIÉ ÉIÉ Ch ng minh r ng ˙ có b ghép ñ y ñ (b ghép mà m i ñ nh ñ u ñư c ghép) n u ch n u É˓É É˚{˓{É v i m i t p ˓ ʃ I 2.40 (Ph ñư ng t i thi u) Cho ˙ {ˢ ˗{ đ th có hư ng khơng có chu trình M t ph đư ng (path cover) m t t p ˜ ñư ng ñi ˙ th a mãn: V i m i ñ nh ˰ ˢ, t n t i nh t m t ñư ng ñi ˜ ch a ˰ ðư ng có th b t đ u k t thúc b t c đâu, tính c ñư ng ñi ñ dài (ch g m m t đ nh) Bài tốn đ t tìm ph đư ng t i thi u (minimum path cover): Ph đư ng g m đư ng nh t G i J s ñ nh c a ñ th , ta ñánh s ñ nh thu c ˢ t t i J Xây d ng đ th hai phía ˙ {I I ˗ { đó: I I {˲# ˲$ {˳# ˳$ ˲ { ˳ { T p c nh ˗ ñư c xây d ng sau: V i m i cung {˩ ˪{ ˗ (h.2.16) m t c nh ˲ ˳ ˗, ta thêm vào 238 ˲# ŷ ŵ Ź Ÿ Ŷ ź ˲$ ˲% ˲& ˲' ˲ ˳# ˳$ ˳% ˳& ˳' ˜# ˜$ ŵŷŹ ŶŸź ˳ Hình 2.16 Bài tốn tìm ph đư ng t i thi u DAG có th quy v tốn b ghép c c ñ i ñ th hai phía G i H m t b ghép ˙ Kh i t o ˜ t p J ñư ng ñi, m i ñư ng ñi ch g m m t ñ nh ˙, ñó ˜ m t ph ñư ng Xét l n lư t c nh c a b ghép, m i xét t i c nh ˲ ˳ ta ñ t c nh {˩ ˪{ n i hai ñư ng ñi ˜ thành m t đư ng…Khi thu t tốn k t thúc, ˜ v n m t ph ñư ng a) Ch ng minh tính b t bi n vịng l p: T i m i bư c xét t i c nh ˲ ˳ H, c nh {˩ ˪{ ˗ ch c ch n s n i hai ñư ng ñi ˜: m t ñư ng ñi k t thúc ˩ m t ñư ng ñi khác b t đ u ˪ T ch tính đ n c a thu t tốn (G i ý: m i xét t i c nh ˲ ˳ H ñ t c nh {˩ ˪{ n i hai ñư ng ñi c a ˜ thành m t đư ng É˜É gi m V y thu t toán k t thúc, É˜É J ÉHÉ , t c mu n É˜É ÉHÉ ) b) Vi t chương trình tìm ph đư ng c c ti u đ th có hư ng khơng có chu trình c) Ch ví d đ th y r ng thu t tốn khơng trư ng h p ˙ có chu trình d) Ch ng minh r ng n u tìm đư c thu t tốn gi i tốn tìm ph đư ng c c ti u ñ th t ng quát th i gian đa th c có th tìm đư c đư ng Hamilton đ th (n u có) th i gian ña th c (Lý 239 thuy t v đ ph c t p tính tốn ch ng minh ñư c r ng ñ th t ng qt, tốn tìm đư ng Hamilton NP-đ y đ tốn tìm ph đư ng c c ti u NP-khó Có nghĩa m t thu t tốn v i đ ph c t p ña th c ñ gi i quy t tốn ph đư ng c c ti u ñ th t ng quát s m t phát minh l n ñáng ng c nhiên) 2.41 T tìm hi u v thu t tốn Hopcroft-Karp Cài đ t so sánh t c ñ th c t v i thu t toán 2.42 (B ghép c c đ i đ th quy hai phía) M t đ th vơ hư ng ˙ {ˢ ˗{ g i đ th quy b c ˫ (˫-regular graph) n u b c c a m i ñ nh ñ u b ng ˫ ð th quy b c đ th khơng có c nh nào, đ th quy b c c nh t o thành b ghép đ y đ , đ th quy b c có thành ph n liên thơng chu trình đơn a) Ch ng minh r ng đ th hai phía ˙ ÉIÉ ÉIÉ {I I ˗{ đ th quy b) Ch ng minh r ng ln t n t i b ghép đ y đ đ th hai phía quy b c ˫ (˫ ŵ{ c) Tìm thu t tốn {É˗É É˗É{ ñ tìm m t b ghép ñ y ñ ñ th quy b c ˫ ŵ 240 ... xuất Giáo dục H Nội - Nh xuất Giáo dục Việt Nam giữ quyền công bố tác phẩm 349 -20 09/CXB/43-644/GD M số : 8I746H9 L I NÓI ð U B Giáo d c ðào t o ban hành chương trình chuyên tin h c cho l p chuyên. .. (/ 62 + L y “/” kh i ngăn x p hi n th , ñ y “+” vào ngăn x p Hi n th (+ 62/ (+ 62/ 4 Ø 62/ 4+ × L y “+” “(” kh i ngăn x p, hi n th “+” ð y “×” vào ngăn x p × 62/ 4+ ( ð y “(” vào ngăn x p ×( 62/ 4+... trình; cu i t p Các chuyên ñ b sách ñư c l a ch n mang tính h th ng t b n đ n chuyên sâu V i tr i nghi m nhi u năm tham gia gi ng d y, b i dư ng h c sinh chuyên tin h c c a trư ng chuyên có truy n