IẾP TỤC CHƯƠNG 2 CỦA MÔN TOÁN RỜI RẠC MÌNH SẼ GỬI DẾN D CÁC BẠN SLIDE BÀI GIẢNG CHƯƠNG 3.3 MÔN TOÁN RỜI RẠC CỦA TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHẤT MONG RẰNG VỚI CÁC SLIDE NÀY SẼ GIÚP CÁC BẠN DỄ DÀNG CHINH PHỤC ĐƯỢC MÔN TOÁN RỜI RẠC NÀY
CHƯƠNG 3: LÝ THUYẾT ĐỒ THỊ GV: Đặng Hữu Nghị Sđt: 0989640319 Email: nghidanghuu@gmail.com NỘI DUNG 3.1 •Các khái niệm lý thuyết đồ thị 3.2 •Biểu diễn đồ thị máy tính 3.3 •Các thuật tốn tìm kiếm đồ thị 3.4 •Đồ thị Euler đồ thị Hamilton 3.5 •Cây khung đồ thị 3.6 •Bài tốn đường ngắn 3.7 •Bài tốn luồng cực đại mạng CÁC THUẬT TỐN TÌM KIẾM TRÊN ĐỒ THỊ Duyệt đồ thị trình qua tất đỉnh đồ thị cho đỉnh viếng thăm lần Thuật tốn tìm kiếm theo chiều sâu (Depth First Search) Thuật toán tim kiếm theo chiều rộng (Breadth First Search) 3.3.1 TÌM KIẾM THEO CHIỀU SÂU TRÊN ĐỒ THỊ Ý tưởng: Từ đỉnh v1 chưa thăm, thăm v1, 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 tất đỉnh thăm Nếu đỉnh vi đó, khơng cịn đỉnh kề với vi chưa thăm quay trở lại tiếp tục tìm đỉnh kề chưa thăm khác vi-1 CÀI ĐẶT ĐỆ QUY B1: Lấy s đỉnh đồ thị B2: Đặt v = s B3: Duyệt đỉnh v B4: Nếu ∀ đỉnh kề v duyệt, đặt v = đỉnh duyệt trước đỉnh v, Nếu v = s đến Bước 6, ngược lại trở lại Bước B5: Chọn u đỉnh kề chưa duyệt v, đặt v = u, trở lại Bước B6: Kết thúc CÀI ĐẶT ĐỆ QUY B1: Lấy s đỉnh đồ thị B2: Đặt v = s B3: Duyệt đỉnh v B4: Nếu ∀ đỉnh kề v duyệt, đặt v = đỉnh duyệt trước đỉnh v, Nếu v = s đến Bước 6, ngược lại trở lại Bước B5: Chọn u đỉnh kề chưa duyệt v, đặt v = u, trở lại Bước B6: Kết thúc CÀI ĐẶT ĐỆ QUY (BẰNG GIẢ MÃ) Thuật toán Procedure DFS(v); (*tim kiem theo chieu sau bat dau tu dinh v; cac bien Chuaxet, Ke la bien toan cuc*) Begin Thăm_đỉnh(v); Chuaxet[v]:=false; For u Є Ke(v) If Chuaxet[u] then DFS(u); End; (*dinh v da duyet xong*) CÀI ĐẶT ĐỆ QUY (BẰNG GIẢ MÃ) Khi đó, tìm kiếm theo chiều sâu đồ thị thực nhờ thuật toán sau: Begin (*Khoi tao tat ca cac dinh cua thi*) for v Є V Chuaxet[v]:=true; for v Є V If Chuaxet[v] then DFS(v); End CÀI ĐẶT KHÔNG ĐỆ QUY B1: Lấy s đỉnh đồ thị B2: Đặt s vào STACK B3: Nếu STACK rỗng đến B4: Lấy đỉnh p từ STACK B5: Duyệt đỉnh p B6: Đặt đỉnh kề p chưa xét (chưa có mặt STACK) vào STACK, trở lại B7: Kết thúc B1: Lấy s đỉnh đồ thị B2: Đặt s vào STACK B3: Nếu STACK rỗng đến B4: Lấy đỉnh p từ STACK B5: Duyệt đỉnh p B6: Đặt đỉnh kề p chưa xét (chưa có mặt STACK) vào STACK, trở lại B7: Kết thúc 10 CÀI ĐẶT BẰNG HÀNG ĐỢI B1: Lấy s đỉnh đồ thị B2: Đặt s vào QUEUE B3: Lặp QUEUE chưa rỗng a Lấy đỉnh p từ QUEUE b Duyệt đỉnh p c Đặt đỉnh kề p chưa xét (chưa có mặt QUEUE) vào QUEUE d Kết thúc lặp 17 CÀI ĐẶT BẰNG HÀNG ĐỢI Thủ tục mơ tả sau: Procedure BFS(v); (*BFS bat dau tu dinh v, cac bien Chuaxet, Ke la bien cuc bo*) Begin QUEUE:=Ø; QUEUE v; (*kết nạp v vào QUEUE*) Chuaxet[v]:=false; While QUEUE Ø Begin p QUEUE; (*lấy p từ QUEUE:*) Tham_dinh(p); For u Є Ke(p) If Chuaxet[u] then Begin QUEUE u; Chuaxet[u]:=false; End; End; End; 18 3.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN ĐỒ THỊ Khi đó, tìm kiếm theo chiều rộng đồ thị thực nhờ thuật toán sau: Begin (*Khoi tao cac dinh cua thi la chua xet*) for f Є V Chuaxet[v]:=true; for v Є V if Chuaxet[v] then BFS(v); End 19 3.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN ĐỒ THỊ Ví dụ: Xét đồ thị cho hình gồm 13 đỉnh, đỉnh đánh số từ đến 13 sau: 20 3.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN ĐỒ THỊ 21 BÀI TẬP 22 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THƠNG a) Bài tốn tìm đường hai đỉnh: Giả sử s t hai đỉnh đồ thị Hãy tìm đường từ s đến t Ý tưởng: Gọi thủ tục DFS(s) (BFS(s)) để thăm tất đỉnh thuộc thành phần liên thông với s Nếu sau thực xong thủ tục mà Chuaxet[t]=true khơng có đường từ s đến t, ngược lại có đường từ s đến t Để ghi nhận đường đi, ta dùng thêm biến Truoc[v] để ghi nhận đỉnh trước đỉnh v đường từ s đến v 23 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THƠNG Khi đó, thủ tục DFS(v) cần sửa câu lệnh if sau: If Chuaxet[u] then Begin Truoc[u]:=v; DFS(u); End; Thủ tục BFS(v) cần sửa đổi câu lệnh if sau: If Chuaxet [u] then Begin QUEUE u; Chuaxet[u]:=false; Truoc[u]:=p; End; 24 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THƠNG Khơi phục đường từ s đến t s x1 x2 … xn t Càiđặt: v = t; while (v != s) { printf (v); v = Truoc[v]; } 25 26 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THƠNG b) Tìm thành phần liên thông đồ thị: Hãy cho biết đồ thị gồm thành phần liên thông thành phần liên thơng gồm đỉnh Do thủ tục DFS(v) (BFS(s)) cho phép thăm tất đỉnh thuộc thành phần liên thông với s, nên số thành phần liên thông đồ thị số lần gọi đến thủ tục Vấn đề lại cách ghi nhận đỉnh thành phần liên thông Ta dùng thêm biến Index[v] để ghi nhận số thành phần liên thông chứa đỉnh v, biến Inconnect để đếm số thành phần liên thông (khởi tạo giá trị 0) 27 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THƠNG Thủ tục Tham_dinh(v) thủ tục DFS(v) BFS(v) có nhiệm vụ gán: Index[v]:=Inconnect; Câu lệnh if chương trình gọi đến thủ tục cần sửa lại sau: Inconnect:=0; If Chuaxet[v] then Begin Inconnect:=Inconnect+1; DFS(v); (*BFS(v)*) End; Kết thúc vịng lặp thứ hai chương trình chính, Inconnect trả số thành phần liên thơng đồ thị, biến mảng Index[v], v Є V cho phép liệt kê đỉnh thuộc thành phần liên thơng 28 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THÔNG /* Khai báo biến ChuaXet, Ke, index*/ DFS(v); { Duyệtđỉnh(v); index[v] = inconnect; ChuaXet[v] = 0; for (u ∈ Ke(v) ) if (ChuaXet[u]) DFS(u); } main() { /* Nhập đồ thị, tạo biến Ke */ for ( v ∈ V ) ChuaXet[v] = 1;/* Khởi tạo cờ cho đỉnh */ inconnect = 0; for ( v ∈ V ) if ( ChuaXet[v] ) { inconnect ++; DFS(v); } } 29 3.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN THƠNG /* Khai báo biến tồn cục ChuaXet, Ke, QUEUE, index */ BFS(v) { QUEUE = 0; QUEUE⇐v; ChuaXet[v] = 0; while ( QUEUE≠ ) { p⇐QUEUE; Duyệtđỉnh p; index[p] = inconnect; for ( u∈Ke(p) ) if (ChuaXet[u]) {QUEUE⇐u ; ChuaXet[u] = 0;} } } main() { for ( v∈V ) ChuaXet[v] = 1; inconnect = 0; for ( v ∈ V ) if ( ChuaXet[v] ) {inconnect + +; BFS(v);} } 30 31 ... DUNG 3. 1 ? ?Các khái niệm lý thuyết đồ thị 3. 2 •Biểu diễn đồ thị máy tính 3. 3 ? ?Các thuật tốn tìm kiếm đồ thị 3. 4 ? ?Đồ thị Euler đồ thị Hamilton 3. 5 •Cây khung đồ thị 3. 6 •Bài tốn đường ngắn 3. 7 •Bài... End 19 3. 3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN ĐỒ THỊ Ví dụ: Xét đồ thị cho hình gồm 13 đỉnh, đỉnh đánh số từ đến 13 sau: 20 3. 3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN ĐỒ THỊ 21 BÀI TẬP 22 3. 3 .3 TÌM ĐƯỜNG... luồng cực đại mạng CÁC THUẬT TỐN TÌM KIẾM TRÊN ĐỒ THỊ Duyệt đồ thị trình qua tất đỉnh đồ thị cho đỉnh viếng thăm lần Thuật tốn tìm kiếm theo chiều sâu (Depth First Search) Thuật toán tim kiếm