Trước hết sắp xếp các cạnh của đồ thị G theo thứ tự không giảm của trọng số.. Bắt đầu từ ET= ∅ , ở mỗi bước ta sẽ lần lượt duyệt trong danh sách cạnh đã sắp xếp, từ cạnh có độ dài nhỏ đ
Trang 1Cây khung
tối thiểu
Trang 2THUẬT TOÁN KRUSKAL
Ý tưởng
Cho đồ thị có trọng số G = (V, E)
Thuật toán sẽ xây dựng tập cạnh ET của cây khung nhỏ
nhất T=(V T , E T ) theo từng bước Trước hết sắp xếp các
cạnh của đồ thị G theo thứ tự không giảm của trọng số Bắt đầu từ ET= ∅ , ở mỗi bước ta sẽ lần lượt duyệt trong danh sách cạnh đã sắp xếp, từ cạnh có độ dài nhỏ đến cạnh có độ dài lớn hơn, để tìm ra cạnh mà việc bổ sung
nó vào tập ET không tạo thành chu trình trong tập này
Trang 3 Giải thuật
1 Bắt đầu từ đồ thị rỗng T có n đỉnh.
2 Sắp xếp các cạnh của G theo thứ tự không giảm
của trọng số
3 Bắt đầu từ cạnh đầu tiên của dãy này, ta cứ thêm
dần các cạnh của dãy đã được xếp vào T theo nguyên tắc cạnh thêm vào không được tạo thành chu trình trong T
4 Lặp lại Bước 3 cho đến khi nào số cạnh trong T
bằng n−1, ta thu được cây khung nhỏ nhất cần tìm
3/51
THUẬT TOÁN KRUSKAL
Trang 4THUẬT TOÁN KRUSKAL
Ví dụ:
Bắt đầu T = ∅
Sắp xếp không giảm
theo trọng số
(v 3 , v 5 ) 4 , (v 4 , v 6 ) 8 , (v 4 , v 5 ) 9 , (v 5 , v 6 ) 14 ,
(v 3 , v 4 ) 16 , (v 1 , v 3 ) 17 , (v 2 , v 3 ) 18 , (v 2 , v 4 ) 20 , (v 1 ,
v 2 ) 33
Trang 5THUẬT TOÁN KRUSKAL
N = 6 (đỉnh) 5 cạnh
5/51
v 1
v 2
v 3
v 4
v 5
v 6
(v3, v5) 4 , (v4, v6) 8 , (v4, v5) 9 , (v5, v6) 14 , (v3, v4) 16 , (v1, v3)
17 , (v2, v3) 18 , (v2, v4) 20 , (v1, v2) 33
Tổng trọng số = 4 + 8 + 9 + 17 + 18 = 56
Trang 6THUẬT TOÁN PRIM
Ý tưởng
Cho đồ thị có trọng số G = (V, E)
Bắt đầu, khởi tạo tập VT = {1 đỉnh bất kỳ }
Sau đó lặp cho đến khi hết các đỉnh của đồ thị (Tức là
VT = V) Mỗi bước lặp, ta chọn cạnh nhỏ nhất (u,v) sao
cho u ∈ VT, v ∈ V – VT Thêm v vào VT, (u,v) vào ET.
Kết thúc ta đc cây khung tối thiểu T = (V T , E T )
Trang 7THUẬT TOÁN PRIM
Ví dụ:
Chọn đỉnh VT = {v1}
(Sắp xếp không giảm
theo trọng số)
(v3, v5) 4, (v4, v6) 8, (v4, v5) 9, (v5, v6) 14,
(v3, v4) 16, (v 1 , v 3 ) 17, (v2, v3) 18, (v2, v4) 20,
(v 1 , v 2 ) 33
7/51
Trang 8 Ví dụ:
Chọn (v1, v3)
VT = {v1, v3}, ET = { (v1, v3) }
Lặp lại,
VT = {v1, v3, v5},
ET = { (v1, v3), (v3, v5) }
(v 3 , v 5 ) 4, (v4, v6) 8, (v4, v5) 9, (v5, v6) 14,
(v 3 , v 4 ) 16, (v1, v3) 17, (v 2 , v 3 ) 18, (v2, v4) 20,
(v , v ) 33
THUẬT TOÁN PRIM
v 1
v 3
v 5
Trang 9THUẬT TOÁN PRIM
N = 6 (đỉnh)
9/51
v 1
v 2
v 3
v 4
v 5
v 6
Tổng trọng số = 4 + 8 + 9 + 17 + 18 = 56
Trang 10THUẬT TOÁN PRIM
Mô tả thông qua bảng các thao tác
TT (u,v) min VT V - VT ET
0 Khởi tạo v1 v2, v3, v4, v5, v6 ∅
1 (v1, v3, 17) v1, v3 v2, v4, v5, v6 (v1, v3)
2 (v3, v5, 4) v1, v3, v5 v2, v4, v6 (v1, v3),
(v3, v5)
Trang 11THUẬT TOÁN PRIM
Giải thuật
1 VT:={v*}, trong đó v* là đỉnh tuỳ ý của đồ thị G
ET:=∅
2 Với mỗi đỉnh vj∉VT, tìm đỉnh wj∈VT sao cho
m(wj,vj) = min m(xi, vj)=:βj
xi∈VT
và gán cho đỉnh vj nhãn [wj, βj] Nếu không tìm đuợc
wj như vậy (tức là khi vj không kề với bất cứ đỉnh nào trong VT) thì gán cho vj nhãn [0, ∞]
11/51
Trang 12THUẬT TOÁN PRIM
Giải thuật
3 Chọn đỉnh vj* sao cho
βj* = min βj
vj∉VT
VT := VT ∪ {vj*},
ET := ET ∪ {(wj*, vj*)}
Nếu |VT| = n thì thuật toán dừng và (VT, ET) là cây khung nhỏ nhất
Nếu |VT| < n thì chuyển sang Bước 4
Trang 13THUẬT TOÁN PRIM
Giải thuật
4 Đối với tất cả các đỉnh vj∉VT mà kề với vj*, ta thay đổi nhãn của chúng như sau:
Nếu βj > m(vj*, vj) thì đặt βj:=m(vj*, vj) và nhãn của
vj là [vj*, βj] Ngược lại, ta giữ nguyên nhãn của vj Sau đó quay lại Bước 3
13/51
Trang 14THUẬT TOÁN PRIM
Ví dụ
Trang 15THUẬT TOÁN PRIM
15/51
Trang 16BÀI T P Ậ
Đồ thị G vô hướng được cho bởi danh sách cạnh như sau:
c,k,4 c,e,7 h,k,5 g,h,8 a,b,4 d,k,8 e,h,5 f,h,9 b,c,8 f,b,6 d,e,5 b,e,6 d,c,5 e,f,5 d,g,5 a,f,6
e,g,7 k,g,6
1 Phát biểu thuật toán Kruskal / Prim
2 Tìm cây khung tối thiểu theo thuật toán Kruskal / Prim
3 Chỉ ra tổng trọng số các cạnh và dãy các cạnh của