You are on page 1of 7

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

KHOA VIỄN THÔNG I

BÀI TIỂU LUẬN


MÔN HỌC: TOÁN RỜI RẠC (TEL 1337)

Giảng viên: Dương Thị Thanh Tú

Nhóm học 01: Nhóm tiểu luận 09

Thành viên

Sái Văn Thắng B21DCVT394

Vương Quốc Thiện B21DCVT411

Phạm Quang Toàn B21DCVT421

Phạm Đức Trọng B21DCVT426

Phạm Đình Trung B21DCVT430

Hà Nội-2023
Thuật toán kruskal: Tìm cây khung nhỏ nhất

Mục lục
1.Phát biểu bài toán
2.Ý tưởng
3.Thuật toán
4.Ví dụ minh họa

1.Phát biểu bài toán


+ Cho G =< V, E > là đồ thị vô hướng liên thông với tập đỉnh V và tập cạnh E.
Mỗi cạnh e của đồ thị được gán với một số không âm c(e) được gọi là độ dài cạnh.
+ Giả sử H =< V, T > là một cây khung của đồ thị G. Ta gọi độ dài c(H) của cây
khung H là tổng độ dài các cạnh:

c( H )=e∑
∈T
c(e)

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 vô hướ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.

2. Ý tưởng

Cây khung (spanning tree) của một đồ thị là một đồ thị con liên thông không có chu
trình đi qua tất cả các đỉnh. Một đồ thị sẽ có nhiều cây khung và bài toán của chúng ta
là phải tìm ra cây khung nhỏ nhất.

Ý tưởng của Thuật toán Kruskal khá đơn giản: Sắp xếp các cạnh từ bé đến lớn theo
trọng số. Lần lượt chọn các cạnh theo thứ tự từ bé đến lớn trong danh sách sao cho
không tạo thành chu trình. Thuật toán sẽ dừng lại khi đã có đủ V−1 cạnh trong cây
khung (với V là số lượng đỉnh của đồ thị).
3.Thuật toán
Thuật toán sẽ xây dựng tập cạnh T của cây khung nhỏ nhât H<V,T> theo từng
bước sau đây:
 Thêm dần từng cạnh vào cây khung
 Mỗi bước chọn cạnh có trọng số nhỏ nhất chưa nằm trong cây khung
+ Nếu việc thêm cạnh này vào cây khung không tạo thành chu trình thì thêm
cạnh này vào
 Thuật toán dừng lại khi.
+ Cây khung có đủ (n − 1) cạnh.
+ Hoặc không còn cạnh nào chưa nằm trong cây khung.
Kruskal( ){
//Bước 1 (khởi tạo):
T = ∅; //Ban đầu tập cạnh cây khung là rỗng
d(H ) = 0; //Ban đầu độ dài cây khung là 0
//Bước 2 (sắp xếp):
< Sắp xếp các cạnh đồ thị theo thứ tự tăng dần của trọng số>;
//Bước 3 (lặp):
while(|T| < n − 1 && E ≠ ∅ ){ // Lặp nếu E ≠ ∅ và |T| < n-1
e = <Cạnh có độ dài nhỏ nhất>;
E = E \ {e}; //Loại cạnh e ra khỏi đồ thị
if (T ∪ {e} không tạo nên chu trình ){
T = T ∪ {e}; //Đưa e vào tập cạnh cây khung
d(H ) = d(H) + d(e); // Cập nhật độ dài cây khung
}
// Bước 4 (Trả lại kết quả):
if(|T| < n − 1) < Đồ thị không liên thông>;
else
return (T, d(H));
}

4.Ví dụ minh họa


Để minh họa cho thuật toán, ta sẽ dùng đồ thị G và đi từng bước của thuật toán:

Trong danh sách các cạnh của G, ta lấy ra cạnh 2-4 nhỏ nhất
Cạnh này không tạo chu trình nên có thể đưa vào cây khung và xét cạnh 1-4.

Đưa 1-4 vào cây khung, xét cạnh 2-5.

Đưa 2-5 vào cây khung, xét cạnh 6-8.


Đưa 6-8 vào cây khung, xét cạnh 6-7.

Đưa 6-7 vào cây khung, xét cạnh 5-6.

Đưa 5-6 vào cây khung, xét cạnh 0-2.


Đưa 0-2 vào cây khung, xét cạnh 5-7. Cạnh 5-7 tạo thành chu trình, vì vậy không được
đưa vào cây khung. Ta xét tiếp cạnh 7-8, cũng không được đưa vào cây khung do tạo
thành chu trình. Xét cạnh 0-3.

Đưa 0-3 vào cây khung. Thuật toán kết thúc vì đã đủ V−1 cạnh.

Vậy T = { (2-4), (1-4), (2-5), (6-8), (6-7), (5-6), (0-2), (0-3) }


D(T) = 0.6 + 1.0 + 1.5 + 1.7 + 1.8 + 1.9 + 2.0 + 2.1 = 12.6

You might also like