1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng lý thuyết đồ thị chương 3 ts lê nhật duy

26 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 26
Dung lượng 510,56 KB

Nội dung

Chương 3: Tìm kiếm đồ thị Nội dung I Duyệt đồ thị theo chiều sâu II Duyệt đồ thị theo chiều rộng III Tìm đường IV Kiểm tra tính liên thơng Chương – Tìm kiếm đồ thị Lý thuyết đồ thị I Duyệt đồ thị theo chiều sâu ™Giới thiệu ƒ Duyệt đồ thị trình qua tất đỉnh đồ thị cho đỉnh viếng thăm lần ƒ Duyệt theo chiều sâu (Depth First Search – DFS) ƒ Duyệt theo chiều rộng (Breadth First Search – BFS) Chương – Tìm kiếm đồ thị I Duyệt đồ thị theo chiều sâu ™Nguyên lý ƒ Bắt đầu tìm kiếm từ đỉnh v đồ thị ƒ Sau chọn u đỉnh tùy ý kề với v (với đồ thị có hướng u đỉnh sau, v đỉnh đầu cung uv) ƒ Lặp lại trình với u khơng tìm đỉnh kề trở đỉnh trước đỉnh mà khơng thể tiếp để tìm qua nhánh khác Chương – Tìm kiếm đồ thị I Duyệt đồ thị theo chiều sâu Thứ tự duyệt: dcba gkl h fm e Chương – Tìm kiếm đồ thị I.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 Chương – Tìm kiếm đồ thị I.1 Cài đặt đệ quy ™ Cài đặt mã giả /* Khai báo biến ChuaXet, Ke */ DFS(v) { Duyệt đỉnh (v); ChuaXet[v] = 0; /*Đánh dấu xét đỉnh v*/ for ( u ∈ Ke(v) ) if ( ChuaXet[u] ) DFS(u); }; void main() { /* Nhập đồ thị, tạo mảng Ke */ for (v ∈ V) ChuaXet[v] = 1; /* Khởi tạo cờ cho đỉnh */ for (v ∈ V) if ( ChuaXet[v] ) DFS(v); } Chương – Tìm kiếm đồ thị I.2 Cài đặt khơng đệ quy ™ Thuật tốn 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 Chương – Tìm kiếm đồ thị I.Duyệt đồ thị theo chiều sâu ™Ý nghĩa ƒ ƒ ƒ ƒ Kiểm tra đường đỉnh Chia đồ thị thành thành phần liên thông Xây dựng khung đồ thị Kiểm tra xem đồ thị có chu trình hay khơng Chương – Tìm kiếm đồ thị Nội dung I Duyệt đồ thị theo chiều sâu II Duyệt đồ thị theo chiều rộng III Tìm đường IV Kiểm tra tính liên thơng Chương – Tìm kiếm đồ thị 10 Lý thuyết đồ thị II Duyệt đồ thị theo chiều rộng Thứ tự duyệt: d e c b f a g m h k l Chương – Tìm kiếm đồ thị 12 II.1 Cài đặt 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 Chương – Tìm kiếm đồ thị 13 II.1 Cài đặt hàng đợi /* Khai báo biến ChuaXet, Ke */ BFS(v) { QUEUE = ∅; QUEUE ⇐ v; ChuaXet[v] = 0;/*Đánh dấu xét đỉnh v*/ while ( QUEUE ≠ ∅ ) { p ⇐ QUEUE; Duyệt đỉnh p; for ( u ∈ Ke(p) ) if ( ChuaXet[u] ) { QUEUE ⇐ u; ChuaXet[u] = 0;/*Đánh dấu xét đỉnh */ } } } void main() /* Nhập đồ thị, tạo biến Ke */ { for ( v ∈ V ) ChuaXet[v] = 1; /* Khởi tạo cờ cho đỉnh */ for ( v ∈ V ) if ( ChuaXet[v] ) BFS(v); } Chương – Tìm kiếm đồ thị 14 II.2 Cài đặt thuật tốn loang Chương – Tìm kiếm đồ thị 15 II.2 Cài đặt thuật toán loang ™ Bước 1: Khởi tạo ƒ Bắt đầu từ đỉnh s Đánh dấu đỉnh s, đỉnh khác s đầu chưa bị đánh dấu ƒ X = {s}, Y = Ø ™ Bước 2: Lặp lại X= Ø ƒ Gán Y= Ø ƒ Với đỉnh u ∈ X • Xét tất đỉnh v kề với u mà chưa bị đánh dấu Với đỉnh đó: – Đánh dấu v – Lưu đường đi, đỉnh liền trước v đường từ s Ỉ v u – Đưa v vào tập Y ƒ Gán X = Y Chương – Tìm kiếm đồ thị 16 II Duyệt đồ thị theo chiều rộng ™Ý nghĩa ƒ ƒ ƒ ƒ Kiểm tra đường đỉnh Chia đồ thị thành thành phần liên thông Xây dựng khung đồ thị Tìm đường ngắn từ đỉnh đến đỉnh lại Chương – Tìm kiếm đồ thị 17 Nội dung I Duyệt đồ thị theo chiều sâu II Duyệt đồ thị theo chiều rộng III Tìm đường IV Kiểm tra tính liên thơng Chương – Tìm kiếm đồ thị 18 Lý thuyết đồ thị III Tìm đường ™Bài toán ƒ Cho đồ thị G, s t hai đỉnh tùy ý đồ thị Hãy tìm đường từ s đến t ™Phương pháp ƒ Bắt đầu từ đỉnh s, Sử dụng DFS BFS để duyệt đồ thị • Tìm thấy ChuaXet(t) = • Khơng tìm thấy ChuaXet(t) = ƒ Sử dụng thêm mảng Truoc[] để lưu vết Chương – Tìm kiếm đồ thị 19 III.1 Tìm đường theo chiều sâu /* Khai báo biến ChuaXet, Ke */ DFS(v); { Duyệt đỉnh (v); ChuaXet[v] = 0; for ( u ∈ Ke(v) ) if ( ChuaXet[u] ) { Truoc[u] = v; /* Lưu vết*/ DFS(u); } } main() // Nhập đồ thị, tạo biến Ke { for ( v ∈ V ) ChuaXet[v] = 1; // Khởi tạo cờ cho đỉnh DFS(s); } Chương – Tìm kiếm đồ thị 20 III.2 Tìm đường theo chiều rộng /* Khai báo biến ChuaXet, Ke , QUEUE */ BFS(v); { QUEUE = ∅; QUEUE ⇐ v; ChuaXet[v] = 0; while ( QUEUE ≠ ∅ ) { p ⇐ QUEUE; Duyệt đỉnh p; for ( u ∈ Ke(p) ) if ( ChuaXet[u] ) { QUEUE ⇐ u; ChuaXet[u] = 0; Truoc[u] = p;/*Lưu vết*/ } } } main() // Nhập đồ thị, tạo biến Ke { for ( v ∈ V ) ChuaXet[v] = 1; // Khởi tạo cờ cho đỉnh BFS(s); } Chương – Tìm kiếm đồ thị 21 III.2 Tìm đường theo chiều rộ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]; } Chương – Tìm kiếm đồ thị 22 Nội dung I Duyệt đồ thị theo chiều sâu II Duyệt đồ thị theo chiều rộng III Tìm đường IV Kiểm tra tính liên thơng Chương – Tìm kiếm đồ thị 23 Lý thuyết đồ thị IV Kiểm tra tính liên thơng ™Bài tốn ƒ Tính số thành phần liên thơng đồ thị, xác định đỉnh thuộc thành phần liên thông ™Phương pháp ƒ Sử dụng DFS BFS ƒ Biến inconnect đếm số thành phần liên thông đồ thị ƒ Mảng index[] lưu số thành phần liên thơng Chương – Tìm kiếm đồ thị 24 IV.1 Tìm theo chiều sâu /* 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); } } Chương – Tìm kiếm đồ thị 25 IV.2 Tìm theo chiều rơng /* Khai báo biến toà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); } } Chương – Tìm kiếm đồ thị 26

Ngày đăng: 25/07/2023, 16:02