Microsoft Word Nhóm 3 (4) BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á BÀI TẬP LỚN HỌC PHẦN Toán rời rạc NHÓM 3 TÊN BÀI TẬP LỚN Đề tài Lý thuyết đồ thị Sinh viên thực hiện Khóa Lớp Mã sinh v[.]
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐƠNG Á BÀI TẬP LỚN HỌC PHẦN: Tốn rời rạc NHÓM TÊN BÀI TẬP LỚN: Đề tài Lý thuyết đồ thị Sinh viên thực Khóa Lớp Mã sinh viên Nguyễn Quang Hoàng 13 DC CNTT13.10.16 20223095 Trần Văn Phúc 13 DC CNTT13.10.16 20222851 Nguyễn Văn Tâm 13 DC CNTT13.10.16 20223183 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á BÀI TẬP LỚN HỌC PHẦN: Tốn rời rạc NHĨM TÊN BÀI TẬP LỚN: Đề tài Lý thuyết đồ thị Điểm STT Sinh viên thực Khóa Lớp Mã SV Nguyễn Quang Hồng 13 DC CNTT13.10.16 20223095 Trần Văn Phúc 13 DC CNTT13.10.16 20222851 Nguyễn Văn Tâm 13 DC CNTT13.10.16 20223183 số Điểm chữ CÁN BỘ CHẤM CÁN BỘ CHẤM (Ký ghi rõ họ tên) (Ký ghi rõ họ tên) -2- MỤC LỤC I, Cơ sở lý thuyết 1, Khái niệm đồ thị 2, Biểu diễn đồ thị máy 3, Duyệt đồ thị (DFS, BFS) .7 4, Thuật tốn tìm đường ngắn .9 5, Thuật toán tìm khung nhỏ 11 II, Cài đặt thuật toán 12 1, Duyệt đồ thị : DFS, BFS 12 2, Đường ngắn từ u -> v .16 3, Cây khung nhỏ G 18 -3- I, Cơ sở lý thuyết 1, Khái niệm đồ thị - Đồ thị cấu trúc toán học sử dụng để mơ hình hóa mối quan hệ đối tượng Nó sử dụng để mơ hình hóa tập hợp đỉnh (vertices) cạnh (edges) nối đỉnh lại với Các đỉnh thường biểu thị cho đối tượng cần quan tâm, cạnh thường biểu thị cho mối quan hệ chúng Đồ thị cơng cụ hữu ích để giải vấn đề liên quan đến mối quan hệ đối tượng, tìm kiếm đường ngắn hai điểm mạng lưới, phân loại liệu, tối ưu hóa - Có hai loại đồ thị đồ thị vơ hướng đồ thị có hướng Trong đồ thị vơ hướng, cạnh khơng có hướng, tức có cạnh nối hai đỉnh ta từ đỉnh sang đỉnh ngược lại Trong đồ thị có hướng, cạnh có hướng, tức có cạnh nối từ đỉnh A đến đỉnh B ta từ đỉnh B sang đỉnh A - Đồ thị có nhiều ứng dụng thực tế, chẳng hạn mơ hình hóa mạng lưới giao thơng, mạng máy tính, mạng xã hội, quy hoạch đường robot, phân loại liệu, nhiều ứng dụng khác -4- 2, Biểu diễn đồ thị máy Có nhiều cách để biểu diễn đồ thị máy, hai cách phổ biến ma trận kề danh sách kề Trong biểu diễn ma trận kề, phần tử ma trận thể cạnh giá trị phần tử cho biết trọng số cạnh (nếu có) Trong biểu diễn danh sách kề, đỉnh biểu diễn danh sách đỉnh kề với + Ví dụ biểu diễn đồ thị ma trận kề: Giả sử ta có đồ thị sau đây: | | | | | Ta biểu diễn đồ thị ma trận kề sau: |1|2|3|4|5|6|7|8| -+ -+ -+ -+ -+ -+ -+ -+ -+ 1|0|1|0|1|0|0|0|0| -+ -+ -+ -+ -+ -+ -+ -+ -+ 2|1|0|1|0|1|0|0|0| -+ -+ -+ -+ -+ -+ -+ -+ -+ 3|0|1|0|0|1|1|0|0| -+ -+ -+ -+ -+ -+ -+ -+ -+ 4|1|0|0|0|1|0|1|0| -+ -+ -+ -+ -+ -+ -+ -+ -+ 5|0|1|1|1|0|1|0|1| -+ -+ -+ -+ -+ -+ -+ -+ -+ 6|0|0|1|0|1|0|0|0| -+ -+ -+ -+ -+ -+ -+ -+ -+ -5- 7|0|0|0|1|0|0|0|1| -+ -+ -+ -+ -+ -+ -+ -+ -+ 8|0|0|0|0|1|0|1|0| -+ -+ -+ -+ -+ -+ -+ -+ -+ + Ví dụ biểu diễn đồ thị danh sách kề: Đồ thị biểu diễn danh sách kề sau: 1: [2, 4] 2: [1, 3, 5] 3: [2, 6] 4: [1, 5, 7] 5: [2, 4, 6, 8] 6: [3, 5] 7: [4, 8] 8: [5, 7] Trong biểu diễn này, đỉnh liệt kê kèm theo đỉnh kề Ví dụ, đỉnh kề với đỉnh đỉnh 4, đỉnh kề với đỉnh 1, 5, tiếp tục cho đỉnh lại -6- 3, Duyệt đồ thị (DFS, BFS) - DFS BFS hai thuật toán quan trọng để duyệt đồ thị : + DFS viết tắt "Depth-First Search", có nghĩa tìm kiếm theo chiều sâu Đây thuật toán duyệt đồ thị đơn giản nhiều thuật toán duyệt đồ thị khác Thuật toán DFS đỉnh đồ thị tiếp tục duyệt đỉnh kề đỉnh đó, đến khơng cịn đỉnh chưa duyệt Các đỉnh duyệt đánh dấu lại để tránh lặp lại q trình duyệt Cụ thể, thuật tốn DFS hoạt động sau: Chọn đỉnh đồ thị làm đỉnh bắt đầu Đánh dấu đỉnh duyệt Duyệt tất đỉnh kề đỉnh tại, đỉnh kề chưa duyệt trở thành đỉnh thuật toán lặp lại từ bước Nếu tất đỉnh kề duyệt đỉnh kề, quay lại đỉnh trước tiếp tục duyệt đỉnh chưa duyệt đỉnh Lặp lại bước tất đỉnh duyệt Kết thuật toán DFS thứ tự duyệt đỉnh đồ thị Thuật toán DFS thường sử dụng để giải số vấn đề, chẳng hạn tìm kiếm đường hai đỉnh, kiểm tra liên thông đồ thị, tìm kiếm thành phần liên thơng mạnh đồ thị, tìm kiếm chu trình đồ thị, nhiều ứng dụng khác -7- + BFS viết tắt "Breadth-First Search", có nghĩa tìm kiếm theo chiều rộng BFS thuật toán duyệt đồ thị khác, với cách tiếp cận khác biệt so với DFS Thuật toán BFS đỉnh đồ thị tiếp tục duyệt đỉnh kề đỉnh trước tiếp tục đến đỉnh kề đỉnh vừa duyệt, sau tiếp tục duyệt đỉnh kề đỉnh vừa duyệt, tiếp tục tất đỉnh duyệt Các đỉnh duyệt đánh dấu lại để tránh lặp lại trình duyệt Cụ thể, thuật tốn BFS hoạt động sau: Chọn đỉnh đồ thị làm đỉnh bắt đầu Đánh dấu đỉnh duyệt Thêm tất đỉnh kề đỉnh vào hàng đợi Lấy đỉnh hàng đợi đánh dấu duyệt Thêm tất đỉnh kề đỉnh vừa duyệt chưa đánh dấu vào hàng đợi Lặp lại bước tất đỉnh duyệt Kết thuật toán BFS thứ tự duyệt đỉnh đồ thị theo cấp độ, tức đỉnh gần đỉnh bắt đầu duyệt trước, sau đến đỉnh cách đỉnh bắt đầu hai cạnh, ba cạnh tiếp tục theo độ dài đường đỉnh Thuật toán BFS thường sử dụng để giải số vấn đề, chẳng hạn tìm kiếm đường ngắn hai đỉnh, tìm kiếm chu trình đồ thị, tìm kiếm thành phần liên thông mạnh đồ thị, nhiều ứng dụng khác -8- 4, Thuật tốn tìm đường ngắn - Thuật tốn tìm đường ngắn thuật toán quan trọng lý thuyết đồ thị sử dụng rộng rãi ứng dụng thực tế Thuật tốn sử dụng để tìm đường ngắn hai đỉnh đồ thị có trọng số + Thuật tốn Dijkstra thuật tốn tìm đường ngắn phổ biến Thuật toán dựa ý tưởng "mở rộng nhánh" để tìm kiếm đường ngắn từ đỉnh xuất phát đến đỉnh khác Thuật tốn sử dụng để tìm kiếm đường ngắn đồ thị vô hướng đồ thị có hướng, xử lý trường hợp đồ thị có trọng số âm Cụ thể, thuật toán Dijkstra hoạt động sau: Khởi tạo mảng chứa khoảng cách tạm thời từ đỉnh xuất phát đến tất đỉnh khác, ban đầu khoảng cách tất đỉnh vô trừ đỉnh xuất phát có khoảng cách Khởi tạo tập hợp chứa tất đỉnh chưa duyệt Ban đầu, tập hợp chứa tất đỉnh đồ thị Lặp lại bước sau tập hợp đỉnh chưa duyệt rỗng: a Tìm đỉnh có khoảng cách tạm thời nhỏ từ đỉnh xuất phát đến đỉnh chưa duyệt b Đánh dấu đỉnh duyệt c Cập nhật khoảng cách tạm thời đỉnh kề đỉnh vừa duyệt khoảng cách tốt khoảng cách Khi tập hợp đỉnh chưa duyệt rỗng, thuật toán kết thúc Kết thuật toán Dijkstra mảng chứa khoảng cách từ đỉnh xuất phát đến tất đỉnh khác đồ thị Nếu khoảng cách tạm thời đỉnh vô cùng, có nghĩa khơng có đường từ đỉnh xuất phát đến đỉnh Tuy nhiên, thuật tốn Dijkstra có số hạn chế Đầu tiên, khơng thể xử lý trường hợp đồ thị có trọng số âm Ngồi ra, đồ thị q lớn, việc tìm kiếm đỉnh có khoảng cách tạm thời nhỏ trở nên chậm + Để xử lý trường hợp đồ thị có trọng số âm, ta sử dụng thuật toán Bellman-Ford Dưới cách thuật toán Bellman-Ford hoạt động: -9- Bước Khởi tạo khoảng cách từ đỉnh nguồn đến tất đỉnh khác vô giá trị lớn (trong đa số trường hợp, ta sử dụng giá trị vô giá trị lớn biểu diễn được) Bước Gán khoảng cách từ đỉnh nguồn đến Bước Lặp qua tất đỉnh đồ thị Với đỉnh, lặp qua tất cạnh kết nối đến đỉnh khác cập nhật khoảng cách tìm thấy đường ngắn Bước Lặp qua tất cạnh lần để kiểm tra xem có chu trình âm đồ thị hay khơng Nếu có, thuật tốn thơng báo đồ thị chứa chu trình âm Bước Kết cuối khoảng cách từ đỉnh nguồn đến tất đỉnh khác Thuật tốn Bellman-Ford có độ phức tạp thời gian O(|V||E|), |V| số đỉnh |E| số cạnh đồ thị Điều có nghĩa thuật tốn sử dụng cho đồ thị có số lượng đỉnh cạnh nhỏ đến trung bình Tuy nhiên, đồ thị lớn mật độ cạnh cao, thuật tốn trở nên chậm - Trong ứng dụng thực tế, thuật tốn tìm đường ngắn sử dụng rộng rãi việc tìm kiếm đường tối ưu mạng giao thông, tìm kiếm đường ngắn mạng máy tính, tìm kiếm đường tối ưu toán lập kế hoạch - 10 - 5, Thuật tốn tìm khung nhỏ - Thuật tốn tìm khung nhỏ (Minimum Spanning Tree - MST) thuật toán quan trọng lý thuyết đồ thị MST đồ thị gốc, chọn cho tổng trọng số cạnh nhỏ nhất.Có hai thuật tốn để tìm MST, thuật tốn Kruskal thuật toán Prim : + Thuật toán Kruskal: Thuật toán Kruskal xử lý cạnh đồ thị theo thứ tự không giảm trọng số Ban đầu, ta xem đỉnh riêng biệt Sau đó, ta chọn cạnh có trọng số nhỏ kiểm tra xem hai đỉnh đầu mút cạnh có nằm hay không Nếu hai đỉnh nằm hai khác nhau, ta gộp hai lại thành cách nối hai đỉnh với Quá trình tiếp tục lại + Thuật toán Prim: Thuật toán Prim bắt đầu với đỉnh xây dựng MST cách chọn cạnh có trọng số nhỏ liên kết đỉnh với đỉnh nằm Quá trình tiếp tục MST hồn thành Cả hai thuật tốn Kruskal Prim đạt độ phức tạp thời gian O(E*log(V)), V số lượng đỉnh đồ thị E số lượng cạnh - MST sử dụng nhiều ứng dụng, chẳng hạn mạng máy tính để tối ưu hóa chi phí kết nối, kỹ thuật điều khiển để tối ưu hóa mạng lưới kỹ thuật tối ưu hóa cấu trúc liệu - 11 - II, Cài đặt thuật toán 1, Duyệt đồ thị : DFS, BFS #include #include #include #include #define max 100 #define FileIn "D:\\G.txt" using namespace std; int chuaXet[max]; // A: ma tran ke cua G, n: so dinh int A[max][max],n; // doc file chua thi G luu vao ma tran A void Doc_File(int A[max][max], int &n) { FILE *f = fopen(FileIn,"rb"); fscanf(f,"%d",&n); cout