CÂY KHUNG NHỎ NHẤT
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 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.
Ví dụ:
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
Phá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.
Xâ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
Thuật toán Kruskal
Ý tưởng thuật toán
Thủ tục MST-KRUSKAL(G,w)
Ví dụ minh hoạ
Thời gian thực hiện thuật toán
Cài đặt thuật toán
Ý 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 n−1, ta thu được cây khung nhỏ nhất cần
tìm.
Vấ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
(disjoint-set forest)
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)
Thủ tục MST-KRUSKAL(G,w)
A ∅
for each vertex v∈V[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)
Ví dụ minh hoạ
8 7
b
f
c
d
h g
ia e
9
10
1 2
4
14
2
4
7 6
11
8
Tìm cây khung nhỏ nhất của đồ thị trên
11
Thực hiện giải thuật Kruskal
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(a)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(b)
1 2 2 4 4 6 7 7 8 8 9 10 11 14
Thực hiện giải thuật Kruskal
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(c)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(d)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(e)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(f)
Thực hiện giải thuật Kruskal
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(g)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(h)
8 7 8 7
b
f
c
d
h g
ia e
9
10
1 2
4
14
2
4
7 6
11
8
(i)
b
f
c
d
h g
ia e
9
10
1 2
4
14
2
4
7 6
11
8
(j)
Thực hiện giải thuật Kruskal
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(k)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(l)
b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(m) b
f
c
d
h g
ia e
8 7
9
10
1 2
4
14
2
4
7 6
11
8
(n)
Thời gian thực hiện thuật toán
Nhận xét:
Giải thuật gọi lần |V| thao tác MAKE-SET
Gọi O(E) lần thao tác FINDSET và UNION
G liên thông nên |E| ≥ |V| - 1.
Thời gian thực hiện của MST-KRUSKAL
Gọi |V| thao tác MAKE-SET
Sắp xếp ở dòng 4 : 0(ElgE)
Dòng 5-8: O(E)
=> Thời gian thực hiện của MST-KRUSKAL: O(ElgE)