Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (685.32 KB, 19 trang )
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
Duy trì: Vòng lặp từ dòng 2 đến 4 duy trì tính chất của A bằng cách chỉ bổ sung các
cạnh an toàn vào tập A.
Kết thúc: Tất cả các cạnh bổ sung vào tập A là cây khung nhỏ nhất. Tập A được trả
về là một cây khung nhỏ nhất.
Tuy nhiên, việc xác định một cạnh an toàn ở dòng 3 là một vấn đề không đơn giản.
Sự tồn tại của một cạnh an toàn là chắc chắn bởi vì khi thực hiện dòng thứ 3 của thuật
toán, tính bất biến sẽ dẫn đến sự tồn tại một cây khung T sao cho A⊆ T. Trong vòng lặp
while, A phải là tập con thực sự của T vì vậy nếu cạnh (u,v)∈T mà (u,v)∉A thì (u,v) là
an toàn của A.
Trong phần còn lại của phần này, ta đưa ra một quy tắc (Định lý 23.1) để nhận biết
các cạnh an toàn. Phần tiếp theo mô tả hai thuật toán sử dụng nguyên tắc này để tìm ra
các cạnh an toàn một cách hiệu quả.
Đầu tiên ta cần định nghĩa một số khái niệm sau, một phép cắt (S,V-S) của đồ thị vô
hướng G=(V,E) là một phân chia của V. Hình 23.2 là ví dụ minh họa của phép cắt (S,VS). Ta nói một cạnh (u,v) ∈ E xuyên qua phép cắt (S,V-S) nếu có đỉnh cuối thuộc S và
đỉnh còn lại thuộc V-S. Một phép cắt bảo toàn tập các cạnh A nếu không có cạnh nào của
A xuyên qua phép cắt. Một cạnh là được gọi là cạnh nhẹ (light edge) xuyên qua phép cắt
nếu trọng số của nó là nhỏ nhất trong mọi trọng số của các cạnh xuyên qua phép cắt. Lưu
ý rằng có thể có nhiều hơn một cạnh nhẹ xuyên qua một phép cắt trong trường hợp liên
kết. Thông thường, một cạnh là một cạnh nhẹ thoả mãn một tính chất nào đó nếu trọng số
của cạnh đó là nhỏ nhất của tất cả các cạnh thoả mãn tính chất đó. Nguyên tắc để nhận
biết các cạnh an toàn cho bởi định lý sau:
Định lý 23.1
Cho G=(V,E) là một đồ thị liên thông, vô hướng với hàm trọng số w định nghĩa trên
E. Cho A là tập con của E gồm các cây khung nhỏ nhất của G, cho (S, V-S) là phép cắt
bất kỳ của đồ thị G và bảo toàn tập các cạnh A, đ ặt (u,v) là cạnh nhẹ (light edge) xuyên
qua (S,V-S). Vậy cạnh (u,v) là cạnh an toàn của A .
Chứng minh. Cho T là một cây khung nhỏ nhất chứa tập A, giả sử T không chứa cạnh
nhẹ (u,v) , bởi vì nếu T chứa cạnh nhẹ điều đó có nghĩa ta chứng minh xong. Ta sẽ xây
dựng cây khung nhỏ nhất khác T’ mà chứa AU{(u,v)} bằng cách sử dụng kỹ thuật cắt
dán, do đó ta có (u,v) là một cạnh an toàn của A.
Trang 3
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
7
8
(a)
4
a
d
9
2
11
S
V-S
c
b
4
7
8
14
e
i
6
10
h
g
1
f
2
h
(b)
8
7
a
11
i
4
1
6
b
8
g
2
d
7
9
c
14
e
10
2
4
f
S V-S
Hình 23.2 Hai hình vẽ trên là phép cắt (S,V-S) của đồ thị ở hình 23.1 (a) Các đỉnh thuộc tập
S được tô màu đen, và các đỉnh thuộc tập V-S là màu trắng. Các cạnh xuyên qua phép cắt là sự
kết nối giữa các đỉnh trắng và đỉnh đen. Cạnh (d,c) là cạnh nhẹ duy nhất đi qua phép cắt. Tập
con A bao gồm các cạnh được tô bóng lưu ý ở đây phép cắt (S,V-S) là phép cắt bảo toàn các
cạnh A bởi vì không có cạnh nào của A xuyên qua phép cắt. (b) đối với đồ thị ở hình (a) các
đỉnh trong tập S ở bên trái và các đỉnh trong tập V-S ở bên phải. Một cạnh xuyên qua phép cắt
nếu nó nối một đỉnh bên trái và một đỉnh bên phải.
Cạnh (u,v) biểu diễn một chu trình bao gồm các cạnh trên đường dẫn p từ u tới v
trong T, như minh họa ở hình 23.3. Bởi vì u và v là các đỉnh đối nhau của phép cắt
Trang 4
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
(S,V-S), do đó có ít nhất một cạnh trong T trên đường dẫn p cũng xuyên qua phép cắt.
Cho (x,y) là cạnh bất kỳ thoả mãn các tính chất trên. Cạnh (x,y) không thuộc A do phép
cắt bảo toàn các cạnh của tập A. Bởi vì (x,y) nằm trên đường dẫn duy nhất từ u đến v
trong T, xoá (x,y) tách T thành hai phần. Thêm (u,v) tạo thành một cây khung mới T’ =T{(x,y)}U {(u,v)}.
Ta tiếp tục biểu diễn T’ là cây khung nhỏ nhất. Bởi vì (u,v) là cạnh nhẹ xuyên qua
(S,V-S) và (x,y) cũng xuyên qua phép cắt do đó w(u,v)≤w(x,y) . Vì vậy:
w(T’) = w(T) - w(x,y) + w(u,v)
≤ w(T)
Do T là cây khung nhỏ nhất, vì vậy mà w(T)≤w(T’). Vì vậy T’ cũng là cây khung
nhỏ nhất.
x
p
u
y
v
Hình 23.3 Chứng minh định lý 23.1 Các đỉnh thuộc S là màu đen và các đỉnh thuộc V-S là
màu trắng. Ta biểu diễn các cạnh trong cây khung nhỏ nhất T nhưng không biểu diễn các cạnh
trong đồ thị G. Các cạnh trong A được tô bóng và (u,v) là cạnh nhẹ xuyên qua phép cắt (S,V-S).
Cạnh (x,y) là cạnh trên đường dẫn duy nhất p từ u đến v trên T. Cây khung nhỏ nhất T’ chứa
(u,v) và được thiết lập bằng cách xoá cạnh (x,y) từ T và thêm cạnh (u,v).
T’ vẫn duy trì được (u,v) là cạnh an toàn của tập A. Ta có A⊆T’ bởi vì A⊆ T và (x,y)
⊈ A ; vì vậy A⋃{(u,v)} ⊆ T'. Do đó T’ là cây khung nhỏ nhất, và (u,v) là cạnh an toàn
của A.
Định lý 23.1 giúp ta hiểu rõ cách thức thực hiện thuật toán GENERIC-MST trên đồ
thị liên thông G=(V,E). Khi thuật toán bắt đầu thực hiện, A là tập các cạnh không tạo
thành chu trình nếu không thì cây khung nhỏ nhất chứa A sẽ chứa một chu trình, điều
này dẫn đến mâu thuẫn. Ớ bất kỳ thời điểm nào khi thực hiện thuật toán, đồ thị
GA=(V,A) là rừng và mỗi thành phần liên thông của GA là một cây. (Một số cây có thể chỉ
Trang 5
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
chứa một đỉnh, ví dụ khi thuật toán bắt đầu thực hiện: A là tập rỗng và rừng chứa [V]
cây, mỗi cây cho mỗi đỉnh). Hơn thế nữa, bất kỳ cạnh an toàn (u,v) thuộc A nối với các
thành phần phân biệt của G A, bởi vì A⋃{(u,v)} phải là tập các cạnh không tạo thành chu
trình.
Vòng lặp từ dòng 2 – 4 của GENERIC MST được thực hiện [V] –1 lần ứng với mỗi
[V]-1 cạnh của cây khung nhỏ nhất lần lượt được xác định thành công. Ban đầu khi
A=∅, có [V] cây trong GA, và số vòng lặp giảm xuống 1. Khi rừng chỉ chứa một cây duy
nhất thì thuật toán kết thúc. Hai thuật toán trong phần 23.2 sử dụng hệ quả của định lý
23.1.
Hệ quả 23.2
Cho G=(V,E) là một đồ thị liên thông, vô hướng với hàm trọng số w định nghĩa trên
E. Cho A là một tập con của E bao gồm một số cây khung nhỏ nhất cho đồ thị G, và cho
C=(VC,EC) là một thành phần liên thông (cây) trong rừng GA=(V,A). Nếu (u,v) là cạnh
nhẹ nối C với vài thành phần khác trong GA, thì (u,v) là cạnh an toàn của A.
Chứng minh Phép cắt (V C,V-VC) bảo toàn các cạnh của tập A, và (u,v) là một cạnh
nhẹ qua phép cắt này. Vì thế (u,v) là cạnh an toàn của A.
Bài tập
23-1-1
Đặt (u,v) là cạnh có trọng số nhỏ nhất của đồ thị G. Chứng tỏ rằng (u,v) thuộc vào một
cây khung nhỏ nhất nào đó của G.
23-1-2
Giáo sư Sabatier đưa ra định lý đảo của định lý 23.1 như sau: đặt G = (V, E) là một đồ
thị liên thông và vô hướng với một hàm trọng số giá trị thực w định nghĩa trên E. Đặt A
là một tập con của E thuộc vào một cây khung nhỏ nhất nào đó của G, đặt (S, V-S) là
phép cắt bất kỳ của G bảo toàn các cạnh của tập A, và đặt (u, v) là một cạnh an toàn của
A xuyên qua phép cắt (S, V-S). Do đó, (u,v ) là một cạnh nhẹ thuộc vào phép cắt. Chứng
minh rằng giả định của giáo sư Sabatier là không đúng bằng cách đưa ra một phản chứng.
23-1-3
Chứng minh rằng nếu một cạnh (u,v) thuộc vào một cây khung nhỏ nhất nào đó thì nó
là một cạnh nhẹ (light) xuyên qua phép cắt của đồ thị.
23-1-4
Trang 6
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
Cho một ví dụ đơn giản về một đồ thị liên thông sao cho với một tập cạnh (u,v): {Tồn
tại một phép cắt (S, V-S) sao cho (u, v) là một cạnh nhẹ xuyên qua (S, V-S)} không tạo
thành một cây khung nhỏ nhất.
23-1-5
Cho e là một cạnh trọng số nhỏ nhất trên một chu trình nào đó của đồ thị liên thông
G= (V,E). Chứng minh rằng có một cây khung nhỏ nhất của G’=(V, E-{e}) đồng thời là
cây khung nhỏ nhất của G. Tức là có một cây khung nhỏ nhất của G mà nó không chứa e.
23-1-6
Chứng minh rằng có một đồ thị có duy nhất một cây khung nhỏ nhất nếu với mỗi phép
cắt của đồ thị, có một cạnh nhẹ duy nhất đi qua phép cắt. Chứng tỏ rằng điều ngược lại
không đúng bằng cách đưa ra một phản chứng.
23-1-7
Giả sử rằng nếu mọi cạnh của một đồ thị đều có trọng số là số dương thì bất kì tập con
của tập cạnh nối tấ cả các đỉnh có tổng trọng số nhỏ nhất phải là một cây. Cho một ví dụ
để chứng tỏ rằng kết luận tương tự không đúng nếu chúng ta cho phép một vài trọng số
không phải là số dương.
23-1-8
Đặt T là một cây khung nhỏ nhất của đồ thị G và L là một danh sách sắp xếp các trọng số
cạnh của T. Chứng tỏ rằng với bất kì cây khung nhỏ nhất khác T’ của G thì danh sách L
cũng là danh sách sắp xếp các trọng số của các cạnh của T’.
23-1-9
Đặt T là một cây khung nhỏ nhất của đồ thị G = (V, E), và đặt V’ là một tập con của V.
Đặt T’ là đồ thị con của T tạo thành từ V’, và đặt G’ là đồ thị con của G tạo thành từ V’.
Chứng tỏ rằng nếu T’ là liên thông thì T’ là một cây khung nhỏ nhất của G’.
23-1-10
Cho một đồ thị G và một cây khung nhỏ nhất T, giả sử rằng ta giảm trọng số của một
trong các cạnh của T. Chứng tỏ rằng T vẫn là cây khung nhỏ nhất của G. Tổng quát hơn,
đặt T là một cây khung nhỏ nhất của G với các trọng số cạnh được cho bởi hàm trọng số
w. Chọn một cạnh (x, y) ∈ T và một số dương k, và định nghĩa hàm trọng số w’ bằng:
w’(u,v) =
Chứng minh rằng T là một cây khung nhỏ nhất của G với các trọng số cạnh cho bởi w’.
23-1-11
Cho một đồ thị G và một cây khung nhỏ nhất T, giả sử rằng chúng ta giảm trọng số của
một trong các cạnh không thuộc T. Cho một thuật toán để tìm ra cây khung nhỏ nhất
trong đồ thị bị thay đổi.
Trang 7
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
23.2 Thuật toán Kruskal và Prim
Hai thuật toán cây khung nhỏ nhất được mô tả trong phần này là sự mở rộng của thuật
toán tổng quát. Mỗi thuật toán sử dụng những quy tắc riêng để xác định một cạnh an toàn
ở dòng thứ 3 của thủ tục GENERIC-MST. Trong thuật toán Kruskal thì A tạo nên một
rừng. Một cạnh an toàn được bổ sung vào tập A thì cạnh đó luôn là cạnh có trọng số nhỏ
nhất trong đồ thị nối hai thành phần phân biệt. Trong thuật toán Prim, A tạo nên một cây
duy nhất trong suốt quá trình thực hiện thuật toán. Cạnh an toàn được bổ sung vào A
luôn là cạnh có trọng số nhỏ nhất nối cây với một đỉnh không thuộc cây.
Trang 8
Cây khung nhỏ nhất- Nhóm thực hiện: Nhóm 6
Hình 23.4: Thực hiện thuật toán Kruskal đối với đồ thị được mô tả ở hình 23.1. Những cạnh
được tô đậm thuộc rừng A đang được trồng. Thuật toán Kruskal quan tâm đến những cạnh được
sắp xếp theo thứ tự của trọng số. Một mũi tên chỉ đến một cạnh là một bước của thuật toán. Nếu
một cạnh nối hai cây phân biệt trong rừng thì cạnh đó được bổ sung vào rừng, sau đó hợp hai
cây đó thành một cây.
Thuật toán Kruskal
Thuật toán Kruskal dựa trên thuật toán cây khung nhỏ nhất tổng quát được đưa ra ở
phần 23.1. Thuật toán này tìm một cạnh an toàn để phát triển rừng bằng cách tìm trong
tất cả các cạnh (u,v) cạnh nào có trọng số nhỏ nhất nối hai cây bất kỳ trong rừng. Ví dụ
C1 và C2 là hai cây được nối với nhau bởi cạnh (u,v). Bởi vì cạnh (u,v) phải là cạnh nhỏ
nhất nối C1 với cây nào đó, thì theo hệ quả 23.2 thì (u,v) là một cạnh an toàn cho C1.
Thuật toán Kruskal là một thuật toán tham lam với vì ở mỗi bước của thuật toán bổ sung
vào rừng một cạnh có trọng số nhỏ nhất.
Cách thực hiện thuật toán Kruskal được xem như là thuật toán dùng để tính toán các
thành phần liên thông ở phần 21.1. Thuật toán này sử dụng cấu trúc dữ liệu rời nhau để
Trang 9