Thuật toán Kruskal là một thuật toán trong lý thuyết đồ thị để tìm cây bao trùm nhỏ nhất của một đồ thị liên thông có trọng số. Nói cách khác, nó tìm một tập hợp các cạnh tạo thành một cây chứa tất cả các đỉnh của đồ thị và có tổng trọng số các cạnh là nhỏ nhất.Thuật toán Kruskal là một ví dụ của thuật toán tham lam. Thuật toán này xuất bản lần đầu tiên năm 1956, bởi Joseph Kruskal1. Một vài thuật toán khác cho bài toán này bao gồm thuật toán Prim, thuật toán xóa ngược, và thuật toán Borůvka.
Chương Bài toán khung nhỏ The Minimum Spanning Tree Problem Nội dung 4.1 Cây tính chất 4.2 Cây khung đồ thị 4.3 Xây dựng tập chu trình đồ thị 4.4 Bài toán khung nhỏ Cõy v rng (Tree and Forest) Định nghĩa Ta gọi đồ thị vô hớng liên thông chu trình Đồ thị chu trình đợc gọi rừng Nh vậy, rừng đồ thị mà thành phần liên thông T1 T2 Rng F gm cõy T1, T2,, T3 T3 VÍ DỤ G1, G2 G3, G4 khơng Các tính chất ◆ Định lý Giả sử T=(V,E) đồ thị vơ hướng n đỉnh Khi mệnh đề sau tương đương: (1) T liên thơng khơng chứa chu trình; (2) T khơng chứa chu trình có n-1 cạnh; (3) T liên thơng có n-1 cạnh; (4) T liên thơng cạnh cầu; (5) Hai đỉnh T nối với đường đơn; (6) T không chứa chu trình thêm vào cạnh ta thu chu trình Nội dung 4.1 Cây tính chất 4.2 Cây khung đồ thị 4.3 Xây dựng tập chu trình đồ thị 4.4 Bài tốn khung nhỏ Cây khung đồ thị ◆ Định nghĩa Giả sử G=(V,E) đồ thị vô hướng liên thông Cây T=(V,F) với F⊂ E gọi khung đồ thị G b c a b d e G c a b d c a e T1 d e T2 Đồ thị G khung T1 T2 Số lượng khung đồ thị Arthur Cayley (1821 – 1895) ◆ Định lý sau cho biết số lượng khung đồ thị đầy đủ Kn : ◆ Định lý (Cayley) Số khung đồ thị Kn nn-2 b a c K3 a b c b c a c a b Ba khung K3 Bài toán hoá học hữu ◆ Biểu diễn cấu trúc phân tử: Mỗi đỉnh tương ứng với nguyên tử ◆ Cạnh – thể liên kết nguyên tử ◆ Bài toán: Đếm số đồng phân cacbua hydro no chứa số nguyên tử cácbon cho trước ◆ methane H C H C H H C H H C H ethane H H C H H C H H H H propane H H H H C H H C H H C H H C H H butane H saturated hydrocarbons CnH2n+2 10 Mơ tả thuật tốn Prim procedure Prim(G, c) begin Chọn đỉnh tuỳ ý r ∈V; Khởi tạo T=(V(T), E(T)) với V(T)={ r }và E(T)=∅; while T có < n đỉnh begin Gọi (u, v) cạnh nhẹ với u ∈ V(T) v∈V(G) – V(T) E(T) ← E(T) ∪ { (u, v) }; V(T) ← V(T) ∪ { v } end end; Tính đắn suy từ hệ chứng minh: Giả sử A tập E tập tập cạnh CKNN G, C thành phần liên thông rừng F = (V, A) Nếu (u, v) cạnh nhẹ nối C với tplt khác F, (u, v) an tồn A 46 Cài đặt thuật tốn Prim i vi th dy Giả sử đồ thÞ cho bëi ma trËn träng sè C={c[i,j], i, j = 1, 2, , n} bớc để nhanh chóng chọn đỉnh cạnh cần bổ sung vào khung, đỉnh đồ thị đợc gán cho nhÃn NhÃn đỉnh v V-S có dạng [d[v], near[v]] : d[v] dùng để ghi nhận khoảng cách từ đỉnh v đến tập đỉnh S: d[v] := min{ c[v, w] : w ∈ S } ( = c[v, z]), near[v] := z ghi nhận đỉnh khung gần v 47 Thut tốn Prim procedure Prim; begin (* Bíc khëi t¹o *) S := { r }; T := ∅ ; d[r] := 0; near[r] := r for v ∈ V \ S begin d[v] := c[r,v]; near[v] := r; end; (* Bíc lỈp *) for k:=2 to n begin Tìm u V\ S thoả mÃn: d[u] = { d[v] : v ∈ V\ S }; S := S ∪ { u }; T := T ∪ { ( u, near[u] ) } ; for v∈ V\ S if d[v] > c[u,v] then begin d[v] := c[u,v] ; near[v] := u; end; end; H = ( S , T ) khung nhỏ đồ thÞ ; end; Thời gian tính: O(|V|2) 48 Thuật tốn Prim – Ví dụ ◆ Ví dụ: Tìm CKNN cho đồ thị cho ma trận trọng số C = 33 17 ∞ ∞ ∞ 33 18 20 ∞ ∞ 17 18 16 ∞ ∞ 20 16 ∞ ∞ 14 ∞ ∞ ∞ 14 49 Thuật tốn Prim: Ví dụ Bước Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh S Khởi tạo 50 Thuật tốn Prim: Ví dụ Đỉnh Khởi tạo [0, 1] Đỉnh [33, 1] Đỉnh [17, 1]* Đỉnh [∞ , 1] Đỉnh [∞ , 1] Đỉnh [∞ , 1] S 1 51 Thuật toán Prim: Ví dụ Đỉnh Khởi tạo Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh S [0, 1] [33, 1] [17, 1]* [∞ , 1] [∞ , 1] [∞ , 1] - [18, 3] - [16, 3] [4, 3]* [∞ , 1] 1, 3 for v∈ V\ S if d[v] > c[u,v] then d[v] := c[u,v] ; near[v] := u; 52 Thuật tốn Prim: Ví dụ Đỉnh Khởi tạo Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh S [0, 1] [33, 1] [17, 1]* [∞ , 1] [∞ , 1] [∞ , 1] 1 - [18, 3] - [16, 3] [4, 3]* [∞ , 1] 1, - [18, 3] - [9,5]* - [14, 5] 1, 3, 5 for v∈ V\ S if d[v] > c[u,v] then d[v] := c[u,v] ; near[v] := u; 53 Thuật tốn Prim: Ví dụ Đỉnh Khởi tạo Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh S [0, 1] [33, 1] [17, 1]* [∞ , 1] [∞ , 1] [∞ , 1] 1 - [18, 3] - [16, 3] [4, 3]* [∞ , 1] 1, - [18, 3] - [9,5]* - [14, 5] 1, 3, - [18,3] - - - [8,4]* 1,3,5,4 for v∈ V\ S if d[v] > c[u,v] then d[v] := c[u,v] ; near[v] := u; 54 Thuật tốn Prim: Ví dụ Đỉnh Khởi tạo Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh S [0, 1] [33, 1] [17, 1]* [∞ , 1] [∞ , 1] [∞ , 1] 1 - [18, 3] - [16, 3] [4, 3]* [∞ , 1] 1, - [18, 3] - [9,5]* - [14, 5] 1, 3, - [18,3] - - - [8,4]* 1,3,5,4 - [18,3]* - - - - 1,3,5,4,6 for v∈ V\ S if d[v] > c[u,v] then d[v] := c[u,v] ; near[v] := u; 55 Thuật tốn Prim: Ví dụ Đỉnh Khởi tạo Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh S [0, 1] [33, 1] [17, 1]* [∞ , 1] [∞ , 1] [∞ , 1] 1 - [18, 3] - [16, 3] [4, 3]* [∞ , 1] 1, - [18, 3] - [9,5]* - [14, 5] 1, 3, - [18,3] - - - [8,4]* 1,3,5,4 - [18,3]* - - - - 1,3,5,4,6 - - - - - - 1,3,5,4,6,2 Độ dài CKNN : 18 + 17 + + + = 56 Tập cạnh CKNN: {(2,3), (3,1), (4,5), (5,3), (6,4)} 56 Người đề xuất toán MST Otakar Borůvka Nhà khoa học Séc (Czech) Người đề xuất toán Đề xuất thuật toán thời gian O(m log n) Bài báo xuất Séc từ năm 1926 Ứng dụng vào việc phát triển hệ thống mạng điện Bohemia 57 Tăng tốc O(m log n) O(m log log n) Yao (1975), Cheriton-Tarjan (1976) O(m β (m, n)) O(m log β (m, n)) Gabow-Galil-Spencer-Tarjan (1986) O(m α (m, n)) Optimal Borůvka, Prim, Dijkstra, Kruskal,… Fredman-Tarjan (1987) Chazelle (JACM 2000) Pettie-Ramachandran (JACM 2002) 58 Questions? 59 60 ... Nội dung 4.1 Cây tính chất 4.2 Cây khung đồ thị 4.3 Xây dựng tập chu trình đồ thị 4.4 Bài toán khung nhỏ 17 BÀI TOÁN CÂY KHUNG NHỎ NHẤT Minimum Spanning Tree (MST) 18 Bài tốn CKNN Bài tốn: Cho... 4.1 Cây tính chất 4.2 Cây khung đồ thị 4.3 Xây dựng tập chu trình đồ thị 4.4 Bài toán khung nhỏ Cây khung đồ thị ◆ Định nghĩa Giả sử G=(V,E) đồ thị vô hướng liên thông Cây T=(V,F) với F⊂ E gọi khung. .. Nội dung 4.1 Cây tính chất 4.2 Cây khung đồ thị 4.3 Xây dựng tập chu trình đồ thị 4.4 Bài toán khung nhỏ 11 Tập chu trình ◆ Gi¶ sư G = (V, E) đơn đồ thị vô hớng liên thông, H=(V,T) khung Các cạnh