Microsoft Word NOI DUNG SKKN nam hoc 2013 2014 Nghia Duyet in o nha doc 1 MMỤỤCC LLỤỤCC I PHẦN ĐẶT VẤN ĐỀ 2 I 1/ Lý do chọn đề tài 2 I 2/ Mục tiêu nghiên cứu 2 I 3/ Nhiệm vụ nghiên cứu 2 I 4/ Đối tượn[.]
MỤC LỤC I PHẦN ĐẶT VẤN ĐỀ: I.1/ Lý chọn đề tài I.2/ Mục tiêu nghiên cứu I.3/ Nhiệm vụ nghiên cứu I.4/ Đối tượng nghiên cứu I.5/ Các phương pháp nghiên cứu II/ PHẦN NỘI DUNG: II.1/ Lịch sử vấn đề nghiên cứu II.2/ Cơ sở lý luận đề tài II.3/ Thực trạng vấn đề nghiên cứu II.4/ Nội dung nghiên cứu kết nghiên cứu A/ NỘI DUNG NGHIÊN CỨU MỘT SỐ KHÁI NIỆM CƠ BẢN 1.1 Đồ thị 1.2 Biểu diễn đồ thị PHƯƠNG PHÁP TÌM KIẾM TRÊN ĐỒ THỊ 11 2.1 Một số khái niệm 11 2.2 Hai thuật tốn tìm kiếm đồ thị 13 MỘT SỐ BÀI TẬP ÁP DỤNG: 15 B/ KẾT QUẢ NGHIÊN CỨU 23 III PHẦN KẾT LUẬN 24 III.1/ Kết luận 24 III.2/Tài liệu tham khảo 24 skkn I PHẦN ĐẶT VẤN ĐỀ: I.1/ Lý chọn đề tài Để hệ thống lại chuyên đề bồi dưỡng HSG chuyên Tin học mà dạy nhiều năm qua, đồng thời qua trình nghiên cứu, giảng dạy, tham khảo ý kiến đồng nghiệp, tơi thấy số tốn tin học ứng dụng số toán kỳ thi học sinh giỏi Tin học ứng dụng lý thuyết đồ thị để giải Chính chọn viết đề tài chuyên đề “CƠ SỞ TOÁN HỌC CỦA MỘT SỐ BÀI TOÁN TRONG LÝ THUYẾT ĐỒ THỊ” (Phần 1: Duyệt đồ thị bản) I.2/ Mục tiêu nghiên cứu Như biết, tốn học có ảnh hưởng lớn đến lĩnh vực sống Các tốn tin có thuật tốn dựa sở lý thuyết toán học vững đem lại kết tốt nhiều so với thuật toán khác Giúp em học sinh có kiến thức tốt, tư tốt lập trình; sở toán học cho lý thuyết đồ thị vấn đề mà người lập trình tin học cần phải nắm vững I.3/ Nhiệm vụ nghiên cứu Trước hết thực đổi phương pháp giảng dạy Tin học làm cho học sinh sáng tạo tìm kết quả, lời giải hay số “dạng tốn tin có vận dụng sở toán học”; giúp thân nắm vững sở toán học, tư thuật toán, khả lập trình, đồng thời trao đổi học tập kinh nghiệm Quý Thầy Cô Tổ Tin học I.4/ Đối tượng nghiên cứu Trong nghiên cứu này, học sinh chọn em học lớp chuyên Tin học khối 10, 11, 12; học sinh bồi dưỡng đội tuyển dự thi HSG cấp tỉnh, cấp quốc gia số giáo viên đứng lớp dạy tin học trường THPT Chuyên Tiền Giang I.5/ Các phương pháp nghiên cứu * Phương pháp suy luận, tổng hợp: kết hợp từ nhiều nguồn tài liệu tham khảo tác giả tra cứu mạng internet với đề thi Học sinh Giỏi rút kinh nghiệm, hệ thống lại kiến thức, mở hướng * Phương pháp trò chuyện – vấn: trao đổi tâm tình với nhiều học sinh giỏi để nắm tình hình việc giải tốn tin lý thuyết đồ thị * Phương pháp khảo sát: thân tham gia giảng dạy lớp, đội tuyển HSG, kỳ tập huấn, đề; tham khảo đồng nghiệp, quý Thầy Cô giảng dạy đội tuyển nhiều năm nên có nắm tình hình sử dụng phương pháp làm em học sinh skkn * Phương pháp phân tích lý luận: phân tích giúp học sinh nắm thật rõ chất vấn đề, lựa chọn phương pháp giải cho phù hợp II/ PHẦN NỘI DUNG: II.1/ Lịch sử vấn đề nghiên cứu Trong năm liên tiếp dạy bồi dưỡng HSG môn Tin Học lớp 10, 11, 12 đội tuyển dự thi HSG cấp Tỉnh, cấp Quốc Gia, đội tuyển dự thi Olympic 30/4 dành cho trường THPT, tham khảo ý kiến đồng nghiệp chuyên dạy bồi dưỡng đội tuyển Tỉnh bạn, trường THPT Chuyên, rút điều “CƠ SỞ TOÁN HỌC RẤT QUAN TRỌNG TRONG DẠY LẬP TRÌNH” Được động viên khuyến khích q Thầy Cô tổ, mạnh dạng chọn viết đề tài “Cơ sở toán học số toán lý thuyết đồ thị” II.2/ Cơ sở lý luận đề tài Kết hợp giảng tài liệu tham khảo, kinh nghiệm thân để phân tích, tổng hợp, hệ thống lại II.3/ Thực trạng vấn đề nghiên cứu Đa số học sinh chuyên tin ngại, sợ giải tốn tin có ứng dụng tốn học; lúng túng q trình phân tích, tổ chức liệu để tìm chất vận dụng kiến thức cách thích hợp, tìm thuật toán tối ưu II.4/ Nội dung nghiên cứu kết nghiên cứu A/ NỘI DUNG NGHIÊN CỨU MỘT SỐ KHÁI NIỆM CƠ BẢN 1.1 Đồ thị 1.1.1 Định nghĩa đồ thị: Là cấu trúc rời rạc gồm đỉnh cạnh nối đỉnh Được mơ tả hình thức: G = (V, E), V gọi tập đỉnh (Vertices) E gọi tập cạnh (Edges) Có thể coi E tập cặp (u, v) với u v hai đỉnh V Một số hình ảnh đồ thị: Sơ đồ giao thơng Mạng máy tính Hình 1.1 Ví dụ mơ hình đồ thị skkn 1.1.2 Một số khái niệm Như định nghĩa đồ thị G = (V, E) cấu trúc rời rạc, tức tập V E tập hữu hạn, tập đếm được, có nghĩa ta đánh số thứ tự 1, 2, 3, cho phần tử tập V E Hơn nữa, đứng phương diện người lập trình cho máy tính ta quan tâm đến đồ thị hữu hạn (V E tập hữu hạn) mà thơi, từ sau, khơng thích thêm nói tới đồ thị, ta hiểu đồ thị hữu hạn Các phần tử thuộc tập V gọi đỉnh đồ thị G Cho hai đỉnh u, v V, e = (u, v) E cặp thứ tự e gọi cung đồ thị, e cặp không thứ tự e gọi cạnh đồ thị Khi e = (u, v) cung u đỉnh đầu cung, v đỉnh cuối cung e Khi e = (u, v) cạnh u v gọi hai đỉnh kề cạnh e hai đỉnh liên thuộc e Hai đỉnh u v (u ≠ v) đồ thị gọi hai đỉnh kề chúng đầu cạnh cung Hai cạnh a, b (hoặc hai cung a, b) gọi hai cạnh kề (hoặc hai cung kề nhau) chúng có đỉnh chung Khuyên cạnh (hoặc cung) có đầu trùng Đỉnh treo đỉnh thuộc cạnh cung Đỉnh cô lập đỉnh không thuộc cạnh cung 1.1.3 Phân loại đồ thị Cho đồ thị G = (V, E), E gồm cạnh G đồ thị vơ hướng Nếu E gồm cung G đồ thị có hướng Nếu E gồm cạnh cung G đồ thị hỗn hợp Đa đồ thị: Đồ thị G = (V, E) vơ hướng (hoặc có hướng) đa đồ thị đồ thị khơng khun có cặp đỉnh nối với cạnh (hoặc cung nối theo thứ tự cặp đỉnh) Đơn đồ thị: Đồ thị G = (V, E) vơ hướng (hoặc có hướng) đơn đồ thị đồ thị khơng khun cặp đỉnh nối với không cạnh (hoặc cung) Vơ hướng Có hướng Vơ hướng Đơn đồ thị Có hướng Đa đồ thị Hình 1.2 Phân loại đồ thị skkn 1.1.4 Bậc đỉnh: 1.1.4.1 Định nghĩa: Bậc đỉnh v đồ thị G = (V, E), ký hiệu deg(v), số cạnh liên thuộc với nó, riêng khuyên đỉnh tính hai lần cho bậc Đỉnh v gọi đỉnh treo deg(v) = gọi đỉnh lập deg(v) = Hình 1.3 deg(v1) = deg(v3) = Deg(v5) = deg(v2) = deg(v4) = deg(v6) = deg(v7) = Đỉnh v4 đỉnh cô lập đỉnh v6 đỉnh treo 1.1.4.2 Mệnh đề: Cho đồ thị G = (V, E) Khi đó: 2|E| = deg(v) vV Chứng minh: Rõ ràng cạnh e = (u, v) tính lần deg(u) lần deg(v) Từ suy tổng tất bậc đỉnh hai lần số cạnh 1.1.4.3 Hệ quả: Số đỉnh bậc lẻ đồ thị số chẵn Chứng minh: Gọi V1 V2 tương ứng tập đỉnh bậc chẵn tập đỉnh bậc lẻ đồ thị G = (V, E) Khi đó: 2|E| = deg(v) deg(v) vV1 vV2 Vế trái số chẵn tổng thứ số chẵn nên tổng thứ hai số chẵn Vì deg(v) lẻ với v V2 nên |V2| số chẵn 1.1.4.4 Mệnh đề: Trong đơn đồ thị, tồn hai đỉnh có bậc Chứng minh: Xét đơn đồ thị G = (V, E) có |V| = n Bậc đỉnh đồ thị có n đỉnh nhận giá trị từ đến n – Rõ ràng đồ thị khơng thể đồng thời có: đỉnh có bậc (đỉnh lập) đỉnh có bậc n – (có cạnh nối với tất đỉnh cịn lại) Vì theo bậc đỉnh, ta phân n đỉnh thành n – nhóm Vậy theo nguyên lý Dirichlet tồn nhóm có đỉnh, tức ln tìm đỉnh có bậc 1.1.4.5 Định nghĩa: Đỉnh u gọi nối tới v hay v gọi nối từ u đồ thị có hướng G (u, v) cung G Đỉnh u gọi đỉnh đầu đỉnh v gọi đỉnh cuối cung 1.1.4.6 Định nghĩa: Bậc vào (tương ứng bậc ra) đỉnh v đồ thị có hướng G, ký hiệu degt(v) (tương ứng dego(v)), số cung có đỉnh cuối v skkn Hình 1.4 degt(v1) = 2, dego(v1) = degt(v3) = 2, dego(v3) = degt(v5) = 1, dego(v5) = degt(v2) = 5, dego(v2) = degt(v4) = 1, deg0(v4) = degt(v6) = 0, dego(v6) = Đỉnh có bậc vào bậc gọi đỉnh cô lập Đỉnh có bậc vào bậc gọi đỉnh treo, cung có đỉnh cuối đỉnh treo gọi cung treo 1.1.4.7 Mệnh đề: Cho G =(V, E) đồ thị có hướng Khi deg (v) deg t vV o (v) = |E| vV Chứng minh: Kết có cung tính lần cho đỉnh đầu lần cho đỉnh cuối 1.2 Biểu diễn đồ thị 1.2.1 Biểu diễn hình học Biểu diễn đỉnh: đỉnh tương ứng điểm ghi mặt phẳng khơng gian Dùng kí hiệu, tên số hiệu đỉnh ghi bên điểm tương ứng Biểu diễn cạnh (cung): Nếu e = (u, v) cạnh nối điểm u với điểm v đoạn thẳng đoạn cong không qua điểm biểu diễn đỉnh khác Nếu e = (u, v) cung nối từ điểm u tới điểm v đoạn thẳng định hướng đoạn cong định hướng (có chiều mũi tên từ u tới v) khơng qua điểm biểu diễn đỉnh khác Hình nhận gọi dạng biểu diễn hình học đồ thị Để thuận tiện người ta gọi dạng biểu diễn hình học đồ thị đồ thị Hình 1.5 Đơn đồ thị, vơ hướng Hình 1.6 Đa đồ thị, vơ hướng skkn Hình 1.7 Đa đồ thị, có hướng 1.2.2 Biểu diễn đồ thị máy tính 1.2.2.1 Biểu diễn đồ thị ma trận liền kề (ma trận liền kề) Giả sử đồ thị G = (V, E) có tập đỉnh V = {u1, u2, …, un}, tập cạnh (hoặc cung) E Ta xây dựng ma trận vuông A cấp n cho i, j: ≤ i, j ≤ n có: 0 xi , x j E Ai, j 1 xi , x j E Ma trận A gọi ma trận liên thuộc (ma trận kề) Ví dụ: 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 Hình 1.8 [ Hình 1.9 Nhận xét: - Nếu G đồ thị vơ hướng ma trận A đối xứng qua đường chéo chính, A ij A ji | i, j:1 i, j n Tổng số hàng i = Tổng số cột i = Bậc đỉnh i = deg(i) - Nếu G đồ thị có hướng, A ma trận liền kề tương ứng ma trận A Tổng số hàng i = Bán bậc đỉnh i = degt(i) Tổng số cột i = Bán bậc vào đỉnh i = dego(i) skkn Trong trường hợp G đơn đồ thị, ta biểu diễn ma trận liền kề A tương ứng phần tử logic Aij = TRUE (i, j) E Aij = FALSE (i, j) E Ưu điểm ma trận liền kề: Đơn giản, trực quan, dễ cài đặt máy tính Để kiểm tra xem hai đỉnh (u, v) đồ thị có kề hay không, ta việc kiểm tra phép so sánh: Auv ≠ Nhược điểm ma trận liền kề: Bất kể số cạnh đồ thị nhiều hay ít, ma trận liền kề ln ln địi hỏi n2 nhớ để lưu phần tử ma trận, điều gây lãng phí nhớ dẫn tới việc biểu diễn đồ thị với số đỉnh lớn Với đỉnh u đồ thị, nhiều ta phải xét tất đỉnh v khác kề với nó, xét tất cạnh liên thuộc với Trên ma trận liền kề việc thực cách xét tất đỉnh v kiểm tra điều kiện Auv ≠0 Như vậy, đỉnh u đỉnh cô lập (không kề với đỉnh nào) đỉnh treo (chỉ kề với đỉnh) ta buộc phải xét tất đỉnh kiểm tra điều kiện dẫn tới lãng phí thời gian 1.2.2.2 Biểu diễn ma trận trọng số Trong nhiều toán đồ thị, cạnh (hoặc cung) e = (ui, uj) đồ thị thường gắn với số c(e) gọi trọng số cạnh (hoặc cung) e Khi thường xây dựng ma trận vng cấp n ma trận C có phần tử C[i, j] = c(e) tồn cạnh (hoặc cung) e = (ui, uj) ngược lại khơng có cạnh nối ui với uj (hoặc khơng có cung nối trực tiếp ui tới uj) C[i, j] = (kí hiệu giá trị không xác định) Trong nhiều trường hợp, ngầm định C[i, i] = với đỉnh đồ thị không khuyên Hình 1.10 skkn 0 15 20 0 0 29 12 15 0 11 20 29 0 0 12 11 0 1.2.2.3 Biểu diễn danh sách cạnh Để có danh sách cạnh/cung đồ thị G = (V, E), người ta liệt kê lưu tất cạnh/cung đồ thị Trong cách biểu diễn này, người ta liệt kê tất cạnh đồ thị danh sách, phần tử danh sách cặp (u, v) tương ứng với cạnh đồ thị (Trong trường hợp đồ thị có hướng cặp (u, v) tương ứng với cung, u đỉnh đầu v đỉnh cuối cung) Danh sách lưu nhớ dạng mảng danh sách móc nối Ví dụ với đồ thị bên: Cài đặt mảng: (1, 3) (2, 4) (3, 5) (4, 1) Hình 1.11 (5, 2) Cài đặt danh sách móc nối: Ưu điểm danh sách cạnh: Trong trường hợp đồ thị thưa (có số cạnh tương đối nhỏ: chẳng hạn m < 6n), cách biểu diễn danh sách cạnh tiết kiệm không gian lưu trữ, cần 2m nhớ để lưu danh sách cạnh Trong số trường hợp, ta phải xét tất cạnh đồ thị cài đặt danh sách cạnh làm cho việc duyệt cạnh dễ dàng (Thuật toán Kruskal chẳng hạn) Nhược điểm danh sách cạnh: Nhược điểm danh sách cạnh ta cần duyệt tất đỉnh kề với đỉnh v đồ thị, chẳng có cách khác phải duyệt tất cạnh, lọc cạnh có chứa đỉnh v xét đỉnh cịn lại Điều tốn thời gian trường hợp đồ thị dày (nhiều cạnh) 1.2.2.4 Biểu diễn danh sách kề Cho đồ thị G = (V, E), với đỉnh u i V ta lưu trữ tất đỉnh kề với vào danh sách, hình thành danh sách kề Thường dùng cách sau tạo danh sách kề: 1.2.2.4.1 Dùng danh sách móc nối: Với đỉnh ui V ta lưu trữ tất đỉnh kề với danh sách liên kết chiều, có nghĩa tương ứng với đỉnh u i, ta phải lưu lại List[ui] chốt danh sách móc nối Tập hợp danh sách liên kết chiều đỉnh gọi danh sách kề đồ thị Ví dụ với đồ thị hình 1.12, danh sách móc nối là: skkn Hình 1.12 1.2.2.4.2 Dùng cách tổ chức danh sách kề theo kiểu Forward Star Mảng chia làm n đoạn, đoạn thứ i mảng lưu danh sách đỉnh kề với đỉnh i: với đồ thị hình 1.13, danh sách kề mảng A gồm 12 phần tử: 10 11 12 5 Đoạn Đoạn Đoạn Đoạn Đoạn Hình 1.13 Xây dựng mảng chiều A P với ý nghĩa sau: Các vị trí j mảng A từ P[i-1]+1 đến P[i] cho biết A[j] đỉnh kề với đỉnh i Ví dụ: Với đồ thị hình 1.13 có số đỉnh N = 5, số cạnh M = Mảng A 1 2*M = 2, 3, 5, 1, 3, 1, 2, 4, 3, 5, 1, 4 Mảng P N = 0, 3, 5, 8, 10, 12 Dựa vào hai mảng A P biết đỉnh kề với đỉnh đỉnh từ vị trí p[2]+1 = + = tới vị trí p[3] = mảng A; đỉnh A[6] = 1, A[7] = A[8] = Lưu ý với đồ thị có hướng gồm m cung cấu trúc Forward Star cần phải đủ chứa m phần tử, với đồ thị vơ hướng m cạnh cấu trúc Forward Star cần phải đủ chứa 2m phần tử Ưu điểm danh sách kề: Đối với danh sách kề, việc duyệt tất đỉnh kề với đỉnh v cho trước dễ dàng, tên “danh sách kề” cho thấy rõ điều Việc duyệt tất cạnh đơn giản cạnh thực nối đỉnh với đỉnh khác kề Nhược điểm danh sách kề: Về lý thuyết, so với hai phương pháp biểu diễn trên, danh sách kề tốt hẳn Chỉ có điều, trường hợp cụ thể mà ma trận kề hay danh sách cạnh khơng thể nhược điểm ta nên dùng ma trận kề (hay danh sách cạnh) cài đặt danh sách kề có phần dài dịng 10 skkn PHƯƠNG PHÁP TÌM KIẾM TRÊN ĐỒ THỊ 2.1 Một số khái niệm 2.1.1 Định nghĩa Đường có độ dài k (k nguyên dương) từ đỉnh u đến đỉnh v đồ thị vô hướng G = (V, E) dãy đỉnh u u0 , u1 , u2 , , uk v mà cạnh (ui , ui 1 ) E , i 0, k Đường cịn biểu diễn dạng dãy cạnh: (u0 , u1 ), (u1 , u2 ), , (u k 1 , uk ) Đỉnh u gọi đỉnh đầu (định xuất phát), đỉnh v gọi đỉnh cuối (đỉnh đích) đường 2.1.2 Định nghĩa Đường có độ dài k (k nguyên dương) từ đỉnh u đến đỉnh v đồ thị có hướng G = (V, E) dãy đỉnh u u0 , u1 , u2 , , uk v mà cung (ui , ui 1 ) E , i 0, k Đường cịn biểu diễn dạng dãy cung: (u0 , u1 ), (u1 , u2 ), , (u k 1 , uk ) Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường 2.1.3 Định nghĩa Đường có đỉnh đầu trùng với đỉnh cuối gọi chu trình (mạch vịng) Đường hay chu trình gọi đơn khơng có cung bị lặp lại Đường hay chu trình gọi khơng có đỉnh bị lặp lại (trừ trường hợp chu trình đỉnh đầu trùng đỉnh cuối lặp lại) 2.1.4 Định nghĩa Đồ thị vô hướng G = (V, E) gọi liên thông ln tìm đường hai đỉnh 2.1.5 Định nghĩa Cho đồ thị vô hướng G = (V, E) đồ thị G đồ thị G ' (V ', E ') Đồ thị G’ gọi vùng liên thông (hoặc thành phần liên thông) G nếu: + G’ liên thông; + Không tồn đường từ đỉnh thuộc G’ tới đỉnh khơng thuộc G’ (nói cách khác bảo đảm tính tối đại liên thơng G’) Ví dụ Trong hình 2.1 xét hai đồ thị G H: G có vùng liên thơng nhất, H có vùng liên thơng H1, H2, H3 Hình 2.1 G liên thông, H gồm vùng liên thông 2.1.6 Định nghĩa Đỉnh v gọi đỉnh khớp (đỉnh rẽ nhánh) đồ thị vô hướng G = (V, E) loại bỏ đỉnh v cạnh liên thuộc với số thành phần liên thông G tăng thêm 11 skkn Cạnh e E gọi cầu loại bỏ khỏi đồ thị G số thành phần liên thơng G tăng thêm đơn vị 2.1.7 Định nghĩa Đồ thị có hướng G = (V, E) gọi liên thông mạnh với cặp đỉnh có thứ tự tuỳ ý ln tìm đường có hướng từ đỉnh thứ đến đỉnh thứ hai Nói cách khác, với cặp đỉnh u v ln tồn hai đường đi: đường có hướng từ đỉnh u đến đỉnh v đường có hướng từ đỉnh v đến đỉnh u 2.1.8 Định nghĩa Đồ thị có hướng G = (V, E) gọi liên thông yếu coi cung cạnh đồ thị vơ hướng tương ứng liên thông Hiển nhiên, đồ thị liên thông mạnh liên thông yếu điều ngược lại chưa Hình 2.2 G liên thơng mạnh, H liên thơng yếu không liên thông mạnh 2.1.9 Mệnh đề: Mọi đơn đồ thị n đỉnh (n 2) có tổng bậc hai đỉnh tuỳ ý không nhỏ n đồ thị liên thông Chứng minh: Cho đơn đồ thị G = (V, E) có n đỉnh (n 2) thoả mãn yêu cầu toán Giả sử G không liên thông, tức tồn hai đỉnh u v cho khơng có đường nối u v Khi đồ thị G tồn hai thành phần liên thông G1 có n1 đỉnh chứa u, G2 chứa đỉnh v có n2 đỉnh Vì G1, G2 hai số thành phần liên thông G nên n1+n n ta có: deg u deg v (n1 1) (n 1) n1 n n n Điều mâu thuẫn dẫn đến kết luận đồ thị G phải liên thông 2.1.10 Hệ quả: Đơn đồ thị mà bậc đỉnh khơng nhỏ nửa số đỉnh đồ thị liên thông 2.1.11 Mệnh đề: Nếu đồ thị có hai đỉnh bậc lẻ hai đỉnh phải liên thơng, tức có đường nối chúng Chứng minh: Cho G = (V, E) đồ thị thị có hai đỉnh bậc lẻ u v Giả sử u v khơng liên thơng với Khi chúng phải thuộc hai thành phần liên thơng đồ thị G, G1 chứa u G2 chứa v Bậc đỉnh u G1 bậc u G, nên G1 đỉnh u có bậc lẻ G1 có đỉnh bậc lẻ Điều mâu thuẫn Vậy hai đỉnh u v phải liên thông 12 skkn 2.2 Hai thuật tốn tìm kiếm đồ thị Có nhiều toán đồ thị yêu cầu duyệt (thăm) tất đỉnh đồ thị, đỉnh lần Những thuật toán duyệt đỉnh gọi thuật toán tìm kiếm đồ thị Trên đồ thị có hai thuật tốn tìm kiếm bản: Thuật tốn tìm kiếm theo chiều sâu (DFS) thuật tốn tìm kiếm theo chiều rộng (BFS) Trong mục xét đồ thị vơ hướng G = (V, E) có N đỉnh M cạnh 2.2.1 Tìm kiếm theo chiều sâu đồ thị (DFS - depth first search) Cài đặt đệ quy: Tư tưởng thuật tốn trình bày sau: Trước hết, đỉnh x kề với S tất nhiên đến từ S Với đỉnh x kề với S tất nhiên đỉnh y kề với x đến từ S Điều gợi ý cho ta viết thủ tục đệ quy DFS(u) mô tả việc duyệt từ đỉnh u cách thông báo thăm đỉnh u tiếp tục trình duyệt DFS(v) với v đỉnh chưa thăm kề với u - Để không đỉnh bị liệt kê tới hai lần, ta sử dụng kỹ thuật đánh dấu, lần thăm đỉnh, ta đánh dấu đỉnh lại để bước duyệt đệ quy khơng duyệt lại đỉnh - Để lưu lại đường từ đỉnh xuất phát S, thủ tục DFS(u), trước gọi đệ quy DFS(v) với v đỉnh kề với u mà chưa đánh dấu, ta lưu lại vết đường từ u tới v cách đặt DD[v] := u, tức DD[v] lưu lại đỉnh liền trước v đường từ S tới v Khi trình tìm kiếm theo chiều sâu kết thúc, đường từ S tới F là: F p1 DD F p DD[p1 ] S procedure DFS(uV); begin Thông báo tới u; Đánh dấu u thăm (có thể tới từ S); Xét đỉnh v kề với u mà chưa thăm, với đỉnh v begin DD[v] := u; {Lưu vết đường đi, đỉnh mà từ tới v u} DFS(v); {Gọi đệ quy duyệt tương tự v} end; end; Begin {Chương trình chính} Nhập liệu: đồ thị, đỉnh xuất phát S, đỉnh đích F; Khởi tạo: Tất đỉnh chưa bị đánh dấu; DFS(S); Nếu F chưa bị đánh dấu khơng thể có đường từ S tới F; Nếu F bị đánh dấu truy theo vết để tìm đường từ S tới F; End 13 skkn Ví dụ: Tìm kiếm DFS đồ thị Hình 2.3, đỉnh 1, thăm đỉnh là: 1, 2, 4, 6, 5, 8, 9, 13, 15, 7, 3, 14, 12, 10, 11 Hình 2.3 Với thể trình đệ quy DFS trên, ta thấy dây chuyền đệ quy là: DFS(S) DFS(u1) DFS(u2) Thì thủ tục DFS gọi cuối dây chuyền thoát đầu tiên, thủ tục DFS(S) gọi đầu dây chuyền cuối Vậy nên chăng, ta có thê mơ tả dây chuyền đệ quy ngăn xếp (Stack) 2.2.2 Tìm kiếm theo chiều rộng BFS (Breadth first search) Cho đồ thị G = đỉnh nguồn s Ý tưởng: Bước 1: Xuất phát từ s, ta tới đỉnh kề với đỉnh s Bước 2: Sau thăm đỉnh kề với đỉnh s, ta tới đỉnh chưa thăm kể với đỉnh vừa thăm bước Bước 3: Sau thăm đỉnh bước 2, ta tới đỉnh chưa thăm kề với đỉnh vừa thăm bước …… Quá trình thực tất đỉnh đến từ đỉnh nguồn thăm Ví dụ: Tìm kiếm BFS đồ thị Hình 2.3 đỉnh 1, thăm đỉnh là: 1, 2, 4, 12, 6, 7, 10, 11, 5, 14, 3, 8, 9, 13, 15 Lưu ý: Mỗi thủ tục DFS(S), BFS(S) cho phép thăm tất đỉnh thành phần liên thơng với s Hai thủ tục gọi tìm kiếm từ đỉnh chưa thăm, thăm tất đỉnh (mỗi đỉnh lần): dù đồ thị có liên thơng hay khơng liên thơng 14 skkn MỘT SỐ BÀI TẬP ÁP DỤNG: 3.1 Tìm đường hai đỉnh 3.1.1 Bài tốn Giả sử s t hai đỉnh đồ thị G Hãy tìm đường từ s đến t 3.1.2 Hướng dẫn Như nêu, hai thủ tục DFS(s) BFS(s) thăm tất đỉnh vùng liên thơng với s Do đó, sau thực xong thủ tục mà t chưa thăm ( dd t false ) khơng tồn đường từ s tới t Ngược lại t thăm ( dd t true ) tồn đường Để ghi nhận đường đi, tổ chức thêm mảng Trace(N) với Trace i j có nghĩa đường có đỉnh j đỉnh trước đỉnh i Lần ngược Trace[t] tìm đường 3.1.3 Chương trình minh họa Chương trình minh họa thuật toán DFS – đệ qui: program Depth_First_Search_Dequi; const max = 100; fi = ‘Duyet_DFS.inp’; fo = ‘Duyet_DFS.out’; var a: array[1 max, max] of Boolean; {Ma tran ke cua thi} Trace: array[1 max] of Integer; {Trace[v] = w, dinh lien truoc v la w} n, X, Y: Integer; f, g: text; procedure Enter; var i, u, v, m: Integer; begin FillChar(a, SizeOf(a), False); {Khoi tao thi chua co canh nao} Assign(f, fi); Reset(f); ReadLn(f, n, m, X, Y); for i := to m begin ReadLn(f, u, v); a[u, v] := True; a[v, u] := True; end; Close(f); end; procedure DFS(u: Integer); {Thuat toan tim kiem theo chieu sau bat dau tu dinh u} var v: Integer; begin for v := to n if (Trace[v] = 0) and a[u, v] then {Voi moi dinh v chua tham ke voi u} begin Trace[v] := u; DFS(v); {Tiep tuc tim kiem theo chieu sau bat dau tu v} end; end; procedure Result; {In duong di tu X toi Y} begin if Trace[Y] = then {Neu Y chua danh dau tham tuc la khong co duong} WriteLn(g, ‘Path from ‘, X, ‘ to ‘, Y, ‘ not found’) 15 skkn else {Truy vet duong di, bat dau tu Y} begin while Y X begin Write(g, Y, ‘