Nội dung trình bày Định nghĩa cây khung Phát biểu bài toán Xây dựng bài toán Thuật toán Kruskal Thuật toán Prim Cài đặt chương trình... Định nghĩa cây khung Trong đồ thị liên
Trang 1CÂY KHUNG NHỎ NHẤT
Trang 2Nội dung trình bày
Định nghĩa cây khung
Phát biểu bài toán
Xây dựng bài toán
Thuật toán Kruskal
Thuật toán Prim
Cài đặt chương trình
Trang 3Định nghĩa cây khung
Trong đồ thị liên thông G, nếu ta loại bỏ cạnh nằm trên chu trình nào đó thì ta sẽ được đồ thị vẫn
là liên thông Nếu cứ loại bỏ các cạnh ở các chu trình khác cho đến khi nào đồ thị không còn chu trình (vẫn liên thông) thì ta thu được một cây nối các đỉnh của G Cây đó gọi là cây khung hay cây bao trùm của đồ thị G
f
i
9
10
4
14
2
4
7 6 11
8
Trang 4Phát biểu bài toán
Bài toán:
Cần nối mạng một hệ thống gồm n máy tính đánh số từ 1 đến n Biết chi phí nối máy i với máy j là m(i,j) (thông thường chi phí này phụ thuộc vào độ dài cáp nối cần sử dụng) Hãy tìm cách nối mạng sao cho tổng chi phí là nhỏ nhất Bài toán tìm cây khung nhỏ nhất.
Trang 5Xây dựng bài toán
Ta có thể mô hình hoá bài toán bằng một đồ thị
liên thông vô hướng G=(V,E) trong đó:
V là tập các đỉnh ứng với các máy tính
E là tập các cạnh ứng với các dây nối giữa các máy tính, và mỗi cạnh (u,v) E∈ , trọng số w(u,v)
thể hiện chi phí (độ dài cần thiết) để nối u và v
Vấn đề đặt ra: tìm được một tập cạnh T E ⊆ bao gồm các cạnh không tạo thành chu trình sao cho tổng trọng số w(T)= (u, v) T w(u, v) là nhỏ nhất
Tập T là một cây và được gọi là cây khung nhỏ nhất => Bài toán tìm cây khung nhỏ nhất : Tìm T
Trang 6Thuật toán Kruskal
Ý tưởng thuật toán
Ví dụ minh hoạ
Thời gian thực hiện thuật toán
Cài đặt thuật toán
Trang 7Ý tưởng thuật toán
G=(V,E) đồ thị liên thông vô hướng
W là hàm trọng số trên E
Bắt đầu từ đồ thị rỗng T
Sắp xếp các cạnh của G theo thứ tự không giảm của trọng số
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
Lặp lại Bước 3 cho đến khi nào số cạnh trong T bằng n1, ta thu được cây khung nhỏ nhất cần tìm
Trang 8Vấn đề cài đặt thuật toán
Câu hỏi đặt ra: Làm thế nào để kiểm tra một
cạnh thêm vào không tạo thành chu trình?
Giải quyết: Biểu diễn các tập rời nhau bằng rừng
Ban đầu khởi tạo rừng T gồm n cây, mỗi cây tương
ứng với mỗi đỉnh của đồ thị bằng thủ tục MAKE-SET
Khi thêm một cạnh (u,v) vào T không tạo thành chu trình thì cạnh đó phải nối hai cây khác nhau của rừng: Kiểm tra FINDSET(u) <> FINDSET(v)?
Hợp hai cây thành một cây bằng thủ tục UNION(u,v)
Trang 9Thủ tục MST-KRUSKAL(G,w)
A
for each vertex vV[G]
do MAKE-SET(v)
sort the edges of E into nondecreasing order by
weight w
for each edge(u,v) E, taken in nondecreasing order by weight
do if FIND-SET(u) ≠ FIND-SET(v)
then A A {(u,v)}
UNION(u,v)
Trang 10Ví dụ minh hoạ
b
f
i
9
10
4
14
2
4
11
8
Tìm cây khung nhỏ nhất của đồ thị trên
Trang 11Thực hiện giải thuật Kruskal
b
f
i
9
10
4
14
2
4
11
8
f
i
9
10
4
14
2
4
11 8
(b)
1 2 2 4 4 6 7 7 8 8 9 10 11 14
Trang 12Thực hiện giải thuật Kruskal
b
f
i
9
10
4
14
2
4
11
8
f
i
9
10
4
14
2
4
11 8
(d)
b
f
i
9
10
4
14
2
4
11
8
f
i
9
10
4
14
2
4
11 8
(f)
Trang 13Thực hiện giải thuật Kruskal
b
f
i
9
10
4
14
2
4
7 6
11
8
f
i
9
10
4
14
2
4
7 6
11 8
(h)
b
f
i
9
10
4
14
2
4
7 6
11
8
f
i
9
10
4
14
2
4
11 8
(j)
Trang 14Thực hiện giải thuật Kruskal
b
f
i
9
10
4
14
2
4
7 6
11
8
f
i
9
10
4
14
2
4
7 6
11 8
(l)
b
f
i
9
10
4
14
2
4
11
8
f
i
9
10
4
14
2
4
11 8
(n)
Trang 15Thời gian thực hiện thuật toán
Nhận xét:
Thời gian thực hiện của MST-KRUSKAL