Chương 3: CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
lượt xem 80
download
Duyệt đồ thị theo chiều sâu * Ý tưởng: - Từ đỉnh v1 nào đó chưa thăm, thăm v1, rồi tìm đỉnh v2 (chưa thăm) kề với v1, thăm v2… Thuật toán lặp
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Chương 3: CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
- Chương 3 CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ 1. Duyệt đồ thị theo chiều sâu * Ý tưởng: - Từ đỉnh v1 nào đó chưa thăm, thăm v1, rồi tìm đỉnh v2 (chưa thăm) kề với v1, thăm v2… Thuật toán lặp lại việc thăm cho tới khi tất cả các đỉnh đều được thăm. - Nếu tại một đỉnh vi nào đó, không còn đỉnh nào kề với vi là chưa thăm thì quay trở lại tiếp tục tìm đỉnh kề chưa thăm khác của vi-1. A B Nếu bắt đầu từ đỉnh A, thì thứ tự thăm có thể là: E A, C, B, D, E D C * Thuật toán: void DFS1(v) { Tham(v); ChuaTham[v]=false; //ghi nhận là đã thăm v để về sau không thăm nữa. For (u∈ Ke(v)) // xét tất cả các đỉnh u kề với v If (ChuaTham[u]) DFS1(u); //neu u chua thăm, thăm u } void DFS() { for (v ∈ V) ChuaTham[v]=true; //ban đầu tất cả các đỉnh đều chưa thăm. for (v∈ V) //xét tất cả các dinh if (ChuaTham[v]) DFS1(v); // neu đỉnh v chua tham thi tham v } * Ví dụ : Xét đồ thị cho trong hình 1 gồm 13 đỉnh, các đỉnh được đánh số từ 1 đến 13 như sau: Hình 1 1
- Giả thiết rằng các đỉnh trong danh sách kề của đỉnh v (Ke(v)) được sắp xếp theo thứ tự tăng dần của chỉ số. Khi đó chỉ số mới (trong ngoặc) của các đỉnh được đánh lại theo thứ tự chúng được thăm trong thuật toán tìm kiếm theo chiều sâu. * Nhận xét: - Mỗi đỉnh sẽ được thăm đúng một lần. - DFS1(v) thăm tất cả các đỉnh thuộc cùng một thành phần liên thông chứa đỉnh v. Số lần DFS gọi DFS1 chính là số thành phần liên thông của đồ thị. - Độ phức tạp của thuật toán là O(n+m). 2. Duyệt đồ thị theo chiều rộng * Ý tưởng: - Từ đỉnh v nào đó chưa thăm, thăm v, cất tất cả các đỉnh u (chưa thăm) kề với v vào hàng đợi. Lấy từ hàng đợi một đỉnh u, thăm u, rồi lại cất tất cả các đỉnh t (chưa thăm) kề với u vào hàng đợi… Thuật toán lặp lại việc thăm cho tới khi hàng đợi rỗng. - Nếu tại một đỉnh x nào đó, không còn đỉnh nào kề với x là chưa thăm thì quay trở lại tiếp tục tìm đỉnh kề chưa thăm khác của y (y là đỉnh trước khi đến x). * Thuật toán: void BFS1(v) { queue= φ ; //khoi tạo queue là rỗng push(queue,v); //cất v vào queue ChuaTham[v]=false; //ghi nhận là đã thăm v để về sau không thăm nữa. while (queue ≠ φ ) // xét tất cả các đỉnh u kề với v { v=pop(queue);//lay v tu queue Tham(v); For (u∈ Ke(v)) // xét tất cả các đỉnh u kề với v If (ChuaTham[u]) { push(queue,u); ChuaTham[u]=false; } } } void BFS() 2
- { for (v ∈ V) ChuaTham[v]=true; //ban đầu tất cả các đỉnh đều chưa thăm. for (v∈ V) //xét tất cả các dinh if (ChuaTham[v]) BFS1(v); // neu đỉnh v chua tham thi tham v } * Ví dụ: Xét đồ thị xét trong hình 1, chỉ số mới (trong ngoặc) của các đỉnh được đánh lại theo thứ tự chúng được thăm trong thuật toán tìm kiếm theo chiều rộng. * Nhận xét: - Mỗi đỉnh sẽ được thăm đúng một lần. - DFS1(v) thăm tất cả các đỉnh thuộc cùng một thành phần liên thông chứa đỉnh v. Số lần DFS gọi DFS1 chính là số thành phần liên thông của đồ thị. - Độ phức tạp của thuật toán là O(n+m). 3. Tìm đường đi và kiểm tra tính liên thông a) Bài toán tìm đường đi giữa hai đỉnh: Giả sử s và t là hai đỉnh nào đó của đồ thị. Hãy tìm đường đi từ s đến t. * Ý tưởng: Gọi thủ tục DFS(s) hoặc (BFS(s)) để thăm tất cả các đỉnh thuộc cùng một thành phần liên thông với s. Nếu sau khi thực hiện xong thủ tục mà Chuaxet[t]=true thì không có đường đi từ s đến t, ngược lại thì có đường đi từ s đến t. Để ghi nhận đường đi, ta dùng thêm biến Truoc[v] để ghi nhận đỉnh đi trước đỉnh v trong đường đi từ s đến v. * Cài đặt: - DFS1(v) cần sửa như sau: ….. If (ChuaTham[u]) { Truoc[u]:=v; DFS1(u); //neu u chua thăm, thăm u } - BFS(v) cần sửa như sau: 3
- ….. If (ChuaTham[u]) { Truoc[u]:=v; push(queue,u); ChuaTham[u]=false; } Chú ý: Đường đi tìm theo BFS là đường đi ngắn nhất theo số cạnh từ s đến t nhưng DFS thì không. b) Tìm các thành phần liên thông của đồ thị: Hãy cho biết đồ thị gồm bao nhiêu thành phần liên thông và từng thành phần liên thông của nó là gồm những đỉnh nào? * Ý tưởng: - Số thành phần liên thông bằng số lần gọi đến thủ tục DFS1() hoặc BFS1(). - Ta dùng biến numConnect để đếm số thành phần liên thông và dùng biến Index[v] để ghi nhận chỉ số của thành phần liên thông chứa đỉnh v (có thể dùng biến ChuaTham[v] thay cho biến Index[v] ) BÀI TẬP CHƯƠNG 3 * Bài 1 : Các miền trên bảng Cho một bảng chữ nhật chia thành MxN ô vuông (M dòng, N cột). Mỗi ô vuông ghi một số nguyên dương (trong khoảng từ 1 đến 255). Một miền của bảng là tập hợp tất cả các ô có cùng giá trị số sao cho chúng đi được sang nhau bằng cách đi qua các ô có chung cạnh và có cùng giá trị số đang xét. Địa chỉ của một miền là tọa độ [dòng, cột] của ô đầu tiên thuộc miền theo thứ tự duyệt từ trái sang phải và từ trên xuống dưới. Diện tích của một miền là số ô thuộc miền đó. Thí dụ bảng: 1 1 2 2 2 1 2 2 1 2 3 1 1 1 2 có 4 miền, miền tô màu xám (giá trị các ô là 2) có địa chỉ [1, 3] và diện tích là 7. Cần xác định: Số miền của mảng. Miền có diện tích lớn nhất (chỉ rõ giá trị diện tích và địa chỉ của miền). Dữ liệu vào cho trong file văn bản (tên file đọc từ bàn phím) có dạng: MN A[1, 1] A[1, 2]...A[1, N] A[2, 1] A[2, 2]...A[2, N] ...................................... A[M, 1] A[M, 2]...A[M, N] trong đó A[i, j] là giá trị số của ô [i, j], các số trên cùng một dòng ghi cách nhau ít nhất một dấu trắng. Yêu cầu chương trình thiết kế theo menu gồm các chức năng: Đọc dữ liệu vào từ file Giải bài toán bằng tìm kiếm theo chiều rộng. Giải bài toán bằng tìm kiếm theo chiều sâu. Kết thúc chương trình. Kết quả tìm đuợc đưa ra màn hình. Giới hạn kích thước: M, N
- * Bài 2. Cho một mạng N (N
- Kết quả câu 3 ghi tiếp vào file TKB.DAT như sau: dòng thứ nhất ghi 2 số Z, W với ý nghĩa trong ngày Z phải học W môn (W là số nhiều nhất các môn học phải học đồng thời trong một ngày), tiếp theo là một dòng ghi tên các môn học phải học đồng thời trong ngày Z. Trong các câu 2 và 3, có thể có nhiều lời giải tương đương chỉ cầu đưa ra một lời giải. Ví dụ 1 MH.DAT TKB.DAT 4 01000010000110001111 1 Ví dụ 2 MH.DAT TKB.DAT 7 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 2 8 4 10 23 0 22 1 2 3 4 1 8 9 12 13 22 13 14 15 171 21 3 * Bài 4: Hình vuông Latinh Hình vuông la tinh cấp 4 là ma trận vuông kích thước 4x4 mà mỗi dòng và mỗi cột của nó đều là một hoán vị của các chữ cái A, B, C, D. Hai hình vuông la tinh được gọi là tương đương nếu từ hình này ta có thể thu được hình kia nhờ sử dụng các phép biến đổi sau: 1) đổi chỗ hai dòng; 2) đổi chỗ hai cột; 3) đổi tên hai chữ cái. Ví dụ: Hai hình vuông la tinh ABCD ABCD q1=BDAC q2=BCDA CADB CDAB DCBA DABC là tương đương, bởi vì đổi chỗ dòng 3 và 4 của q 1 ta thu được ABCD BDAC DCBA CADB tiếp đến đổi chỗ cột 3 và 4 ta thu được ABDC BDCA DCAB CABD cuối cùng, đổi tên hai chữ C và D cho nhau (nghĩa là thay C bởi D và thay D bởi C) ta thu được q 2. Yêu cầu: Cho q 1, q 2 là hai hình vuông la tinh cấp 4. Hãy xác định xem hai hình vuông đã cho có tương đương hay không? Dữ liệu vào: file văn bản LATIN.INP có cấu trúc như sau: 4 dòng đầu tiên chức các dòng của hình vuông q 1; 4 dòng tiếp theo chứa các dòng của hình vuông q 2; (các phần tử trong một dòng được viết liền nhau); Kết quả: Ghi ra file văn bản có tên LATIN.OUT dưới dạng sau: Dòng đầu tiên ghi số lượng phép biến đổi k (k=0, nếu hai hình vuông là không tương đương); Các dòng tiếp theo ghi dãy các phép biến đổi cần áp dụng để từ q 1 thu được q 2; thông tin về một phép biến đổi bao gồm: chỉ số của phép biến đổi, chỉ số hai dòng (cột) cần đổi chỗ hoặc hai chữ cái cần đổi tên cho nhau. Ví dụ: các file dữ liệu và kết quả có thể: LATIN.INP LATIN.OUT ABCD BDAC DCBA CADB ABCD BCDA CDAB DABC 3 1 3 4 2 3 4 3 C D 6
- * Bài 5: Truyền tin trên mạng Có một nhóm gồm N lập trình viên được đánh số từ 1 tới N, một số người trong họ có biết địa chỉ email của nhau. Khi biết một thông tin nào mới họ gửi thông tin đó cho nhau. Bạn là một người rất quan trọng và bạn biết tất cả các mối quan hệ của họ cũng như bạn có một thông tin rất đặc biệt mà muốn cho tất cả họ đều biết. Hãy lập trình chỉ ra một số ít nhất các lập trình viên cần cho họ biết thông tin sao cho những người đó có thể thông báo cho tất cả những người còn lại thông tin của bạn. Dữ liệu cho trong file văn bản với tên INFOR.INP trong đó dòng đầu chức số N (N
- Nếu dòng đầu là CO thì dòng 2 chứa số nguyên xác định số bước di chuyển tối thiểu. Ví dụ : BI.INP 5341 23214 8 212 415 452 513 322 234 531 351 BI.OUT CO 3 * Bài 8: Gỡ mìn Cho bảng hình chữ nhật kích thước MxN (M số dòng, N số cột) ô vuông. Mỗi ô mang giá trị 0 hoặc 1, nếu ô (i, j) có mìn A[i, j] = 1, ngược lại thì A[i, j] = 0. (a) Một người xuất phát từ ô (X1, Y1) không có mìn, kiểm tra xem người này có thể di chuyển đến ô (X2, Y2) được hay không bằng cách di chuyển sang những ô chung cạnh không có mìn. (b) Nếu kết quả câu a là người đó không thể di chuyển đến (X2, Y2) được thì hãy chỉ ra cách gỡ ít nhất những quả mìn để anh ta có thể di chuyển đến (X2, Y2). Dữ liệu vào: file text GOMIN.INP Dòng đầu là 6 số M, N, X1, Y1, X2, Y2 cách nhau bởi khoảng trắng. M dòng tiếp theo, mỗi dòng gồm N số 0/1 tương ứng có mìn hoặc không có mìn, mỗi số cách nhau bởi khoảng trắng. Dữ liệu ra: file text GOMIN.OUT Dòng đầu chứa số 0/1 tương ứng với đi được / không đi được. Nếu là không đi được thì dòng thứ hai là số K tương ứng với số mìn ít nhất cần phải gỡ. Nếu có số K ở dòng thứ hai thì K dòng tiếp theo, mỗi dòng i gồm 2 số tương ứng với chỉ số cột và chỉ số dòng của ô thứ i cần phải gỡ mìn. * Bài 9: Cho một đồ thị vô hướng G gồm N đỉnh xác định bởi ma trận kề A[N, N] trong đó A[i, j] = 1 nếu cạnh (i, j) Î G và A[i, j] = 0 nếu (i, j) Ï G. Hãy cài đặt thuật toán và viết chương trình xác định tính liên thông của đồ thị G. Nếu G không liên thông, hãy cho biết số thành phần liên thông trong G và liệt kê cụ thể các thành phần liên thông này. * Bài 10: Tìm kiếm Một vùng đất hình chữ nhật được chia thành các mảnh đất theo dạng ô lưới MxN. Mỗi ô có thể trồng trọt được sẽ được đánh dấu là 1, các ô còn lại được đánh dấu là 0. Hai ô gọi là kế nhau nếu chúng có chung 1 cạnh (ngang hay dọc). Một khu đất trồng là tập hợp các ô có thể trồng trọt được nằm kề nhau lớn nhất nghĩa là các khu đất trồng phân cách nhau bởi các ô được đánh dấu là 0. Hãy 8
- xác định số lượng và chỉ rõ cụ thể các khu đất trồng nằm trong vùng đất. Giả thiết rằng số lượng các ô khá lớn. 9
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng An toàn và bảo mật thông tin: Chương 3 - ThS. Trần Phương Nhung
30 p | 288 | 53
-
Bài giảng Thuật toán: Chương 3 - GV. Nguyễn Thanh Cẩm
67 p | 164 | 31
-
Bài giảng Cấu trúc dữ liệu và thuật toán: Chương giới thiệu - Nguyễn Khánh Phương
8 p | 81 | 21
-
Bài giảng Lý thuyết ngôn ngữ lập trình: Chương 3 - CĐ CNTT Hữu nghị Việt Hàn
14 p | 156 | 8
-
Giáo trình Cấu trúc dữ liệu và thuật toán: Phần 2 (In năm 2013)
179 p | 17 | 7
-
Bài giảng Phân tích thiết kế giải thuật và cấu trúc dữ liệu: Phần 1 - ĐH CNTT&TT
56 p | 110 | 7
-
Bài giảng Kỹ thuật lập trình: Chương 3.3 - Trường Đại học Ngoại ngữ - Tin học TP.HCM
45 p | 11 | 6
-
Bài giảng Cấu trúc dữ liệu: Chương 3 - Trường ĐH Mở TP. HCM
35 p | 35 | 5
-
Bài giảng Các hệ thống thông minh nhân tạo và ứng dụng - Chương 3: Bài toán tìm kiếm 1
68 p | 39 | 5
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 3 - Bùi Tiến Lên
50 p | 29 | 5
-
Thuật toán và cấu trúc dữ liệu: Phần 2
179 p | 46 | 5
-
Chương 3 Các phương pháp tìm kiếm và sắp xếp
3 p | 90 | 5
-
Bài giảng Tin học đại cương 1 - Chương 3: Thuật toán
19 p | 38 | 4
-
Bài giảng Cấu trúc dữ liệu: Chương 2, 3 - Trịnh Xuân
11 p | 66 | 4
-
Bài giảng Nhập môn tin học: Chương 3 - Trần Phước Tuấn
16 p | 75 | 4
-
Bài giảng Chương 2: Giải thuật và cấu trúc dữ liệu - TS. Vũ Thị Hương Giang
40 p | 86 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật (Data structures and Algorithms): Chương 3 - Ngô Công Thắng
19 p | 17 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn