BÀI tập lớn TOÁN rời rạc chủ đề thuật toán BFS và bài toán duyệt tất cả các thành phần liên thông của đồ thị

18 28 0
BÀI tập lớn TOÁN rời rạc chủ đề thuật toán BFS và bài toán duyệt tất cả các thành phần liên thông của đồ thị

Đ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

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA VIỄN THƠNG BÀI TẬP LỚN TỐN RỜI RẠC Chủ đề: Thuật toán BFS toán duyệt tất thành phần liên thông đồ thị Giảng viên: Dương Thanh Tú Họ tên Mã sinh viên Đinh Tiến Hùng B20DCVT173 Lê Quang Anh B20DCVT021 Hà Nội 2022 I THUẬT TỐN TÌM KIẾM THEO CHIỀU RỘNG (BFS) - Thuật tốn duyệt đồ thị ưu tiên chiều rộng (Breadth-first search – BFS) thuật tốn tìm kiếm thiết yếu đồ thị Mà đỉnh gần đỉnh xuất phát duyệt trước - Ứng dụng BFS giúp ta giải tốt số toán thời gian không gian tối thiểu Đặc biệt tốn tìm kiếm đường ngắn từ đỉnh gốc tới tất đỉnh khác Trong đồ thị khơng có trọng số tất trọng số nhau, thuật tốn ln trả đường ngắn Ngồi ra, thuật tốn cịn dù để tìm thành phần liên thơng đồ thị, kiểm tra đồ thị hai phía,… II Mơ tả thuật toán BFS Đầu tiên ta thăm đỉnh nguồn ss Việc thăm đỉnh ss phát sinh thứ tự thăm đỉnh (u1,u2,…up)(u1,u2, …up) kề với ss (những đỉnh gần ss nhất) Tiếp theo, ta thăm đỉnh u1u1, thăm đỉnh u1u1 lại phát sinh yêu cầu thăm đỉnh (v1,v2, …,vq)(v1,v2,…,vq) kề với u1u1 Nhưng rõ ràng đỉnh vv “xa” ss đỉnh uu nên chúng thăm tất đỉnh uu thăm Tức thứ tự thăm đỉnh là: s,u1,u2, …,up,v1,v2,…,vq,… - Mã giả thuật toán BFS: BFS(u){ // Step 1: Khởi tạo Queue = Ø; // Tạo hàng đợi rỗng Push(queue, u); // Đẩy u vào hàng đợi Visited[u] = true; // Đánh dấu u thăm // Step2: Lặp đến hàng đợi chưa rỗng While(queue != Ø) v = pop(queue); // Lấy đỉnh đầu hàng đợi xóa khỏi hàng đợi / Duyệt tất đỉnh kề với v mà chưa thăm đẩy vào hàng đợi for(int x : ke[v]){ if(!visited[x]){ // Nếu x chưa thăm push(queue, x); visited[x] = true; EndIf EndFor EndWhile / Step3: Trả lại kết Return() End Ví dụ: Cho đồ thị G = , trình bày q trình thuật tốn BFS bắt đầu chạy từ đỉnh STT Trạng thái Queue Các đỉnh duyệt 1 Ø 2,3,5,10 3,4,5,10 1,2 5,10,4,6,7,9 1,2,3 10,4,6,7,9,8 1,2,3,5 4,6,7,9,8 1,2,3,5,10 6,7,9,8 1,2,3,5,10,4 7,9,8 1,2,3,5,10,4,6 9,8 1,2,3,5,10,4,6,7 10 1,2,3,5,10,4,6,7,9 11 Ø 1,2,3,5,10,4,6,7,9,8 III, Đánh giá độ phức tạp thuật toán BFS *)Độ phức tạp thời gian Gọi |V||V| số lượng đỉnh |E||E| số lượng cạnh đồ thị Trong trình BFSBFS, cách biểu diễn đồ thị có ảnh hưởng lớn tới chi phí thời gian thực giải thuật : Nếu đồ thị biểu diễn danh sách kề (vector g[]) : o Ta thực thuật toán cách tối ưu mặt thời gian nhờ khả duyệt qua đỉnh kề đỉnh cách hiệu o Vì ta sử dụng mảng visit[] để ngăn việc đẩy đỉnh vào hàng đợi nhiều lần nên đỉnh thăm xác lần Do đó, ta độ phức tạp thời gian O(|V|)O(|V|) dành cho việc thăm đỉnh o Bất đỉnh thăm, cạnh kề với đỉnh duyệt, với thời gian dành cho cạnh O(1)O(1) Từ phần nhận xét định lý Bắt tay (Handshaking lemma), ta độ phức tạp thời gian O(|E|)O(|E|) dành cho việc duyệt cạnh o Nhìn chung, độ phức tạp thời gian thuật toán O(|V|+| E|)O(|V|+|E|) Đây cách cài đặt tốt Nếu đồ thị biểu diễn ma trận kề : o Ta độ phức tạp thời gian O(|V|)O(|V|) dành cho việc thăm đỉnh (giải thích tương tự trên) o Với đỉnh thăm, ta phải duyệt qua toàn đỉnh đồ thị để kiểm tra đỉnh kề với Do đó, thuật tốn độ phức tạp O(|V|2)O(|V|2) IV THUẬT TOÁN BFS DUYỆT TẤT CÁC THÀNH PHẦN LIÊN THÔNG CỦA ĐỒ THỊ Đếm số thành phần liên thông đồ thị vơ hướng - Nếu đồ thị liên thơng số thành phần liên thơng Tương ứng với thủ tục BFS(u) gọi lần - Nếu đồ thị khơng liên thơng số thành phần khơng liên thơng >1 Suy xác định số thành phần liên thông cách gọi hàm BFS - Thuật toán xác định số thành phần liên thông đồ thị Mã giả Số TPLT(){ //Khởi tạo số TPLT ban đầu đồ thị = cnt = 0; //Lặp for(int i = 1; i > n >> m; for(int i = 1; i > x >> y; adj[x].push_back(y); adj[y].push_back(x); } } void BFS(int u){ queue q; q.push(u); visited[u] = true; while(!q.empty()){ int v = q.front(); q.pop(); cout

Ngày đăng: 20/12/2022, 09:08

Tài liệu cùng người dùng

Tài liệu liên quan