TIẾP NỐI CHƯƠNG 2 CỦA SLISE MÔN TOÁN RỜI RẠC MÌNH XIN GỬI ĐẾN CÁC BẠN CHƯƠNG 3 MÌNH MONG RẰNG VỚI NHỮNG MẪU SLIDE NÀY SẼ GIÚP MỌI NGƯỜI DỄ DÀNG HƠN KHI HỌC TẬP VÀ THỰC HÀNH MÔN NÀY ..... ,,,,,, .....
CHƯƠNG 3: LÝ THUYẾT ĐỒ THỊ GV: Đặng Hữu Nghị Sđt: 0989640319 Email: nghidanghuu@gmail.com NỘI DUNG 3.1 •Các khái niệm lý thuyết đồ thị 3.2 •Biểu diễn đồ thị máy tính 3.3 •Các thuật tốn tìm kiếm đồ thị 3.4 •Đồ thị Euler đồ thị Hamilton 3.5 •Cây khung đồ thị 3.6 •Bài tốn đường ngắn 3.7 •Bài tốn luồng cực đại mạng 3.6 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT Bài tốn tìm đường ngắn hai đỉnh đồ thị liên thơng có ý nghĩa to lớn Có thể dẫn toán nhiều toán thực tế quan trọng Ví dụ: Bài tốn chọn hành trình tiết kiệm Bài tốn chọn phương pháp tiết kiệm để đưa hệ động lực lực từ trạng thái xuất phát đến trạng thái đích Bài lốn lựa chọn đường truyền tin với chi phí nhỏ mạng thơng tin V.v… 3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU Xét đồ thị G =< V, E > với |V| = n, |E| = m Với cạnh u, v ∈ E, có giá trị trọng số A[u, v] Đặt A[u, v] = ∞ (u, v) ∉ E Nếu dãy v0, v1 , , vk đường G 𝑘𝑖=1 𝐴[𝑣𝑖−1 , 𝑣𝑖 ] gọi độ dài đường Bài toán: Tìm đường ngắn từ đỉnh s đến đỉnh t đồ thị G Đường ta gọi đường ngắn từ s đến t cịn độ dài ta ký hiệu d(s, t) Nếu không tồn đưịmg từ s đến t ta đặt d(s,t) = 3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU Một tính chất đường ngắn phát biểu cách khơng hình thức sau: Mọi đoạn đường đường ngắn đường ngắn Nếu biết khoảng cách từ s đến t, đường ngắn từ s đến t, ta tìm cách dễ dàng Để tìm đường đi, cần để ý cặp đỉnh s, t ϵ V tuỳ ý (s≠ t) ln tìm đỉnh v cho: d(s, t) = d(s, v) + a(v, t) đỉnh v đỉnh trước đỉnh t đường ngắn từ s đến t Tiếp theo ta lại tìm đỉnh u cho d(s,v) = d(s,u) + a(u, v), 3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU Thuật tốn sau để tìm đường ngắn từ s đến t biết độ dài Đầu vào: d[v] - khoảng cách từ đỉnh s đến tất đỉnh lại v ϵ V t - đỉnh đích a[u,v] , u, v ϵ V - ma trận trọng số cung Đầu ra: Mảng STACK chứa dãy đỉnh xác định đường ngắn từ s đến t 3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU procedure Find_Path; begin STACK := ; STACK t; v := t ; while v ≠ s begin u := đỉnh thoả mãn d[v] = d[u] + a[u, v]; STACK u ; v : = u; end; end; Độ phức tạp tính tốn cuả thuật tốn O(n2) Ta dùng biến mảng Truoc[v], v ϵV , để ghi nhớ đỉnh trước V đường tìm kiếm 3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ MỘT ĐỈNH Thuật tốn mơ tả sau: Từ ma trận trọng số A[u,v], u, v ∈ V, tìm cận d[v] khoảng cách từ s đến tất đỉnh v ∈ V Nếu thấy d[u] + A[u,v] < d[v] d[v] = d[u] + A[u, v] (làm tốt lên giá trị d[v]) Q trình kết thúc khơng thể làm “tốt lên” Khi d[v] cho ta giá trị ngắn từ đỉnh s đến đỉnh v Giá trị d[v] gọi nhãn đỉnh v 3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ MỘT ĐỈNH Khi thể kỹ thuật tính tốn máy tính, cận d[v] gọi nhãn đỉnh v, cịn việc tính lại cận gọi phép gán nhãn cho đồ thị toàn thủ tục thường gọi thủ tục gán nhãn Để tính khoảng cách từ s đến t, đây, ta phải tính khoảng cách từ s đến tất đỉnh lại đồ thị Hiện chưa biết thuật toán cho phép tìm đường ngắn hai đỉnh làm việc thực hiệu thuật toán tìm đường ngắn từ đỉnh đến tất đỉnh lại 3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ MỘT ĐỈNH 10 THUẬT TOÁN FLOYD Chi tiết 47 THUẬT TOÁN FLOYD 48 THUẬT TOÁN FLOYD 49 THUẬT TOÁN FLOYD 50 THUẬT TOÁN FLOYD 51 THUẬT TOÁN FLOYD Ma trận ghi nhận đường p[i, j], i, j = 1, 2…, n p[i, j] ghi nhận đỉnh trước đỉnh j đường ngắn từ i đến j 52 Code Thuật toán Floyd #include #include #include void Alloc(int n, int **&A) { int i; A= new int *[n+1]; for(i=0;i