Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
287,09 KB
Nội dung
CHƯƠNG 3 TÌM KIẾM TRÊN ĐỒ THỊ Tơn Quang Toại Khoa CNTT, Đại học Ngoại ngữ ‐ Tin học TP.HCM Nội dung Một số khái niệm Thuật tốn tìm kiếm theo chiều rộng Thuật tốn tìm kiếm theo chiều sâu Ứng dụng Một số khái niệm Đường đi, chu trình Tính liên thơng 2 đỉnh liên thơng Đồ thị vơ hướng liên thơng Đồ thị có hướng Liên thơng mạnh Miền liên thông Đỉnh khớp, cạnh cầu Một số khái niệm Đường (Path): Đường từ đỉnh x đến đỉnh y trong đồ thị G=(V, E) là dãy đỉnh liên tiếp nối đỉnh x đến đỉnh y: ଵ ଶ trong đó: ଵ ାଵ Độ dài đường đi: Là số cạnh đường Đường đơn (simple): Là đường qua mỗi cạnh tối đa 1 lần Một số khái niệm Chu trình (Cycle): Là đường có đỉnh đầu trùng với đỉnh cuối Chu trình đơn: Mỗi cạnh xuất tối đa 1 lần chu trình Một số khái niệm Hai đỉnh liên thơng: Hai đỉnh x, y được gọi liên thơng với có đường từ x đến y Đồ thị liên thông: Đồ thị vô hướng G=(V, E) gọi đồ thị liên thơng x liên thơng với y Một số khái niệm Đồ thị liên thơng mạnh: Đồ thị có hướng G=(V, A) được gọi đồ thị liên thông mạnh x liên thơng với y Thành phần liên thơng: Là tập đỉnh liên thông với bổ sung thêm 1 đỉnh khác khơng liên thơng Một số khái niệm Cạnh cầu: Cho đồ thị G=(V, E). Cạnh gọi cầu xóa cạnh e thì số thành phần liên thông tăng lên Đỉnh khớp: Cho đồ thị G=(V, E). Đỉnh gọi khớp xóa cạnh liên thuộc với v thì số thành phần liên thơng tăng lên Tìm kiếm trên đồ thị Tìm kiếm đồ thị: Cho đồ thị G=(V, E) và 1 đỉnh Tìm kiếm đồ thị phương pháp xuất phát từ đỉnh s, và theo cạnh liên thuộc để viếng thăm (duyệt) các đỉnh đồ thị cho đỉnh viếng thăm 1 lần, nhằm tìm nghiệm tốn Ví dụ: Kiểm tra xem có đường từ đỉnh u đến đỉnh v khơng? Kiểm tra đồ thị có liên thơng hay khơng Tìm kiếm trên đồ thị Trong chương chúng ta sẽ tìm hiểu hai thuật tốn tìm kiếm đồ thị: Thuật tốn tìm kiếm theo chiều rộng (Breadth First Search ‐ BFS) Thuật tốn tìm kiếm theo chiều sâu (Depth First Search ‐ DFS) Tìm kiếm trên đồ thị theo chiều rộng Nhận xét Những đỉnh gần với s nhất sẽ được viếng thăm trước Các đỉnh chỉ được viếng thăm duy nhất 1 lần Tìm kiếm đồ thị theo chiều rộng Cài đặt: Cấu trúc liệu Đồ thị: Giả sử đồ thị lưu danh sách kề LinkedList[] v; Dùng mảng bool[] visited để đánh dấu đỉnh viếng thăm hay chưa: • visited[i] = true: đỉnh i viếng thăm • visited[i] = false: đỉnh i chưa viếng thăm bool[] visited; Tìm kiếm đồ thị theo chiều rộng Cài đặt: Cấu trúc liệu Dùng queue để lưu trật tự đỉnh xử lý • Đỉnh thêm vào cuối queue • Đỉnh ở đầu queue sẽ đỉnh xử lý Queue q; Tìm kiếm trên đồ thị theo chiều rộng Cài đặt bằng hàng đợi void BFS(int s) { visited[s]=true; q.Enqueue(s); // Process node s while(q.Count!=0) { s = q.Dequeue(); foreach (int u in v[s]) { if (visited[u]) continue; visited[u]=true; q.Enqueue(u); // Process node u } } } Tìm kiếm trên đồ thị Nhận xét Mỗi phương thức DFS(s), BFS(s) cho phép thăm tất đỉnh thuộc thành phần liên thông với s Muốn duyệt hết tất đỉnh đồ thị phải gọi phương thức DFS() và BFS() nhiều lần, mỗi lần 1 đỉnh chưa viếng thăm Ứng dụng Tìm thuật tốn cho tốn sau Bài tốn đường • Hãy cho biết có đường từ đỉnh s đến đỉnh t hay khơng Nếu có đường đường gồm thứ tự đỉnh qua • Tìm đường ngắn (theo số cạnh qua) đỉnh đồ thị khơng có trọng số Bài tốn miền liên thơng • • • • Kiểm tra tính liên thơng đồ thị vơ hướng Kiểm tra tính liên thơng mạnh đồ thị có hướng Liệt kê đỉnh thành phần liên thông Xác định cạnh cầu đỉnh khớp đồ thị Thuật tốn tìm đường đi giữa 2 đỉnh Bài tốn: Giả sử s và t là 2 đỉnh của đồ thị. Hãy tìm đường đi từ s đến t Ý tưởng/Thuật tốn: BFS(s) hay DFS(s) sẽ thăm tất cả các đỉnh thuộc cùng miền liên thơng với s. Do đó sau khi BFS(s)/DFS(s) chạy xong mà đỉnh t chưa gán nhãn thì khơng có đường đi Để ghi nhận đường đi ta dùng mảng pre[] với pre[i] = j ý nghĩa trên đường đi j là đỉnh trước của đỉnh i Thuật tốn tìm đường đi giữa 2 đỉnh Nhận xét: Đường tìm BFS(s) là đường qua ít đỉnh Cũng áp dụng tìm đường có hướng BFS/DFS Thuật tốn kiểm tra tính liên thơng của đồ thị vơ hướng Bài tốn: Cho đồ thị vơ hướng. Kiểm tra đồ thị có liên thơng khơng? Ý tưởng/Thuật toán: Duyệt đồ thị DFS(0), BFS(0) với đỉnh Nếu tồn 1 đỉnh chưa viếng thăm đồ thị khơng liên thơng. Trong trường hợp đỉnh viếng thăm đồ thị liên thơng Thuật tốn kiểm tra tính liên thơng đồ thị có hướng Bài tốn: Cho đồ thị có hướng G=(V, E). Kiểm tra đồ thị có liên thơng mạnh khơng? Ý tưởng/Thuật tốn Kiểm tra từ đỉnh 0 có đường đến đỉnh x khác hay không cách dùng BFS(0)/DFS(0) Kiểm tra đỉnh x có đường đến đỉnh 0 hay khơng • Tạo đồ thị chuyển vị G T (V , E T ) với T E {(v, u )|(u , v) E } Thuật tốn kiểm tra tính liên thơng của đồ thị có hướng Nhận xét rằng: Nếu trong G có đường đi từ u đến v thì trong ் sẽ có đường đi từ v đến u và ngược lại Vậy để kiểm tra có đường đi từ mọi đỉnh x đến đỉnh 0 trong G hay khơng ta sẽ kiểm tra có đường đi từ đỉnh 0 đến các đỉnh x trong ் hay khơng Thuật tốn tìm thành phần liên thơng Bài tốn: Cho đồ thị vơ hướng. Tìm số thành phần liên thơng đồ thị Ý tưởng/Thuật tốn: Gọi BFS(s)/DFS(s) thì đỉnh thăm từ s sẽ có số hiệu thành phần liên thông Tăng số hiệu thành phần liên thông duyệt BFS/DFS cho đỉnh chưa viếng thăm, … Thuật toán kiểm tra cạnh cầu Thuật toán Kiểm tra cạnh cầu: Cho G=(V, E). Kiểm tra cạnh e=(u, v) có cầu hay không Bước 1: Đếm số thành phần liên thông đồ thị G Bước 2: Xóa cạnh e=(u, v) khỏi G gọi G’ Bước 3: Đếm số thành phần liên thông đồ thị G’. Nếu số thành phần liên thông đồ thị G’ lớn số thành phần liên thông đồ thị cũ G thì e là cầu. Ngược lại e khơng cầu Thuật toán kiểm tra đỉnh khớp Thuật toán Kiểm tra đỉnh khớp: Cho G=(V, E). Kiểm tra đỉnh v có đỉnh khớp hay khơng Bước 1: Đếm số thành phần liên thông đồ thị G Bước 2: Xóa cạnh kề v khỏi G gọi G’ Bước 3: Đếm số thành phần liên thông đồ thị G’. Nếu số thành phần liên thông đồ thị G’ lớn số thành phần liên thông đồ thị cũ G ít 2 thì v là đỉnh khớp. Ngược lại v khơng đỉnh khớp Tóm tắt chương 3