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
Trang 1CHƯƠNG 3: LÝ THUYẾT ĐỒ THỊ
GV: Đặng Hữu Nghị Sđt: 0989640319
Email: nghidanghuu@gmail.com
Trang 2NỘI DUNG
3.1 •Các khái niệm cơ bản của lý thuyết đồ thị
3.2 •Biểu diễn đồ thị trên máy tính
3.3 •Các thuật toán tìm kiếm trên đồ thị
3.4 •Đồ thị Euler và đồ thị Hamilton
3.5 •Cây và cây khung của đồ thị
3.6 •Bài toán đường đi ngắn nhất
Trang 3CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
Duyệt đồ thị là quá trình đi qua tất cả các đỉnh của đồ
thị sao cho mỗi đỉnh của nó được viếng thăm đúng
Trang 43.3.1 TÌM KIẾM THEO CHIỀU SÂU TRÊN ĐỒ
THỊ
Ý 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
Trang 5CÀI ĐẶT ĐỆ QUY
B1: Lấy s là một đỉnh của đồ thị
B2: Đặt v = s
B3: Duyệt đỉnh v
B4: Nếu ∀ đỉnh kề của v đều
được duyệt, đặt v = đỉnh đã được
duyệt trước đỉnh v, Nếu v = s thì
đi đến Bước 6, ngược lại trở lại
Trang 6CÀI ĐẶT ĐỆ QUY
B1: Lấy s là một đỉnh của đồ thị
B2: Đặt v = s
B3: Duyệt đỉnh v
B4: Nếu ∀ đỉnh kề của v đều
được duyệt, đặt v = đỉnh đã được
duyệt trước đỉnh v, Nếu v = s thì
đi đến Bước 6, ngược lại trở lại
Bước 5.
B5: Chọn u là đỉnh kề chưa được
duyệt của v, đặt v = u, trở lại
Bước 3
Trang 7CÀ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) do
If Chuaxet[u] then DFS(u);
End; (*dinh v da duyet xong*)
7
Trang 8CÀI ĐẶT ĐỆ QUY (BẰNG GIẢ MÃ)
Khi đó, tìm kiếm theo chiều sâu trên đồ thị được thực
hiện nhờ thuật toán sau:
Trang 9CÀI ĐẶT KHÔNG ĐỆ QUY
Trang 11p STACK; (*lấy p từ QUEUE:*)
Tham_dinh(p);
For u Є Ke(p) do
If Chuaxet[u] then Begin
Trang 123.3.2 TÌM KIẾM THEO CHIỂU SÂU TRÊN ĐỒ
THỊ
Khi đó, tìm kiếm theo chiều sâu trên đồ thị được thực
hiện nhờ thuật toán sau:
Trang 13 Ví dụ: Xét đồ thị cho trong hình Các đỉnh của nó được
đánh số lại theo thứ tự chúng được thăm theo thủ tục tìm
kiếm theo chiều sâu mô tả ở trên 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ố
13
Trang 153.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN
ĐỒ THỊ
Ý 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 (QUEUE).
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)
15
Trang 18p QUEUE; (*lấy p từ QUEUE:*)
Tham_dinh(p);
For u Є Ke(p) do
If Chuaxet[u] then Begin
QUEUE u;
Chuaxet[u]:=false;
End;
Trang 193.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN
ĐỒ THỊ
Khi đó, tìm kiếm theo chiều rộng trên đồ thị được thực
hiện nhờ thuật toán sau:
Trang 203.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN
ĐỒ THỊ
Ví dụ: Xét đồ thị cho trong hình gồm 13 đỉnh, các đỉnh được đánh số từ 1 đến
13 như sau:
Trang 213.3.2 TÌM KIẾM THEO CHIỂU RỘNG TRÊN
ĐỒ THỊ
21
Trang 22BÀI TẬP
Trang 233.3.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 23
Trang 243.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 trong nó như 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 trong nó như sau:
If Chuaxet [u] then Begin
QUEUE u;
Chuaxet[u]:=false;
Truoc[u]:=p;
Trang 253.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN
Trang 273.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN
THÔ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
Do thủ tục DFS(v) (BFS(s)) cho phép 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ên số
thành phần liên thông của đồ thị bằng số lần gọi đến thủ
tục này
Vấn đề còn lại là cách ghi nhận các đỉnh trong từng
thành phần liên thông
Ta dùng thêm biến Index[v] để ghi nhận chỉ số của thành
phần liên thông chứa đỉnh v, và biến Inconnect để đếm
số thành phần liên thông (khởi tạo giá trị 0) 27
Trang 283.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN
THÔNG
Thủ tục Tham_dinh(v) trong các thủ tục DFS(v) và BFS(v) có
nhiệm vụ gán: Index[v]:=Inconnect;
Câu lệnh if trong các chương trình chính gọi đến các thủ tục
này cần được sửa lại như 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 trong chương trình chính, Inconnect
trả về số thành phần liên thông của đồ thị, biến mảng
Trang 293.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN
inconnect ++; DFS(v);
}
Trang 303.3.3 TÌM ĐƯỜNG ĐI VÀ KIỂM TRA TÍNH LIÊN