You are on page 1of 26

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

KHOA VIỄN THÔNG I

Tiểu luận
Toán rời rạc
Chủ Đề: Cây và Cây khung đồ thị
Giảng Dương Thị Thanh Tú
viên:
Sinh viên: 1. Lương Ngọc Duy - B21DCVT160
(Nhóm trưởng)
2. Vũ Đình Du - B21DCVT128
3. Nguyễn Tiến Cường - B21DCVT098
4. Nguyễn Mạnh Dũng - B21DCVT471
5. Nguyễn Khánh Duy - N21DCVT017B

Nhóm 02
môn học:

1
Mục lục
Ví Dụ Minh Họa
1. Lương Ngọc Duy ....................................................................................3
2. Vũ Đình Du.............................................................................................7
3. Nguyễn Tiến Cường.............................................................................11
4. Nguyễn Mạnh Dũng.............................................................................15
5. Nguyễn Khánh Duy ..............................................................................21

2
 Lương Ngọc Duy - B21DCVT160

 Bài toán 1: Xây dựng cây khung bằng thuật toán DFS và BFS bắt đầu
từ đỉnh u=1
 DFS
Các bước thực hiện
Bước Free-DFS(u) T
0 1 T=Ø
1 1,2 T=T∪{(1,2)}
2 1,2,3 T=T∪{(2,3)}
3 1,2,3,4 T=T∪{(3,4)}
4 1,5 T=T∪{(1,5)}
5 1,5,6 T=T∪{(5,6)}
6 1,5,6,7 T=T∪{(6,7)}
7 1,5,6,7,8 T=T∪{(7,8)}
8 1,5,6,7,8,9 T=T∪{(8,9)}
9 1,5,6,7,10 T=T∪{(7,10)}
10 1,5,6,7,10,11 T=T∪{(10,11)}
11 1,5,6,7,10,11,12 T=T∪{(11,12)}
12 1,5,6,7,,10,11,12,13 T=T∪{(12,13)}
Kết luận:

3
T={(1,2),(2,3),(3,4),(4,5),(1,5),(5,6),(6,7),(7,8),(8,9),(7,10),(10,11),(11,12),
(12,13)}
 BFS
Các bước thực hiện
Bước Free-DFS(u) T
0 1 T=Ø
1 2,3,4,5 T=T∪{(1,2),(1,3),(1,4),1,5)}
2 3,4,5
3 4,5
4 5
5 6,7,8,9 T=T∪{(5,6),(5,7),(5,8),(5,9)}
6 7,8,9
7 8,9,10 T=T∪{(7,10)}
8 9,10
9 10
10 11,12,13 T=T∪{(10,11),(10,12),(10,13)}
11 12,13
12 13
Kết luận:
T={(1,2),(1,3),(1,4),(1,5),(5,6),(5,7),(5,8),(5,9),(7,10),(10,11),(10,12),
(10,13)}
 Bài toán 2: Xây dựng cây khung nhỏ nhất

4
Cho đồ thị vô hướng có trọng số G
=<V,E> được biểu diễn dưới dạng ma trận
trọng số như hình trên. Xây dựng cây khung nhỏ nhất từ đỉnh 1
 Sử dụng thuật toán Kruskal
- Bước 1:T = Ø ; D(T) = 0
- Bước 2. Sắp xếp các cạnh Bước 3:
theo thứ tự tăng dần của
trọng số:
Đầu Cuối Trọng Số STT Cạnh được xét T U E
1 3 1 1 E\(1,3) T=T U (1,3); D(T)=1
1 2 2 2 E=E\(1,2) T=T U (1,2); D(T)=1+2=3
2 3 2 3 E=E\(2,3) Tạo nên chu trình
1 4 3 4 E=E\(1,4) T=T U (1,4); D(T)=3+3=6
3 4 4 5 E=E\(3,4) Tạo nên chu trình
2 6 5 6 E=E\(2,6) T=T U (2,6); D(T)=6+5=11
2 7 5 7 E=E\(2,7) T=T U (2,7); D(T)=11+5=16
3 6 5 8 E=E\(3,6) Tạo nên chu trình
4 5 5 9 E=E\(4,5) T=T U (4,5); D(T)=16+5=21
4 6 5 10 E=E\(4,6) Tạo nên chu trình
5 6 6 11 E=E\(5,6) Tạo nên chu trình
5 10 6 12 E=E\(5,10) T=T U (5,10); D(T)=21+6=27
6 7 6 13 E=E\(6,7) Tạo nên chu trình
6 8 6 14 E=E\(6,8) T=T U (6,8); D(T)=27+6=33
6 9 6 15 E=E\(6,9) T=T U (6,9); D(T)=35+6=39
6 10 6 16 E=E\(6,10) Tạo nên chu trình
7 8 6 17 E=E\(7,8) Tạo nên chu trình
8 9 7 18 E=E\(8,9) Tạo nên chu trình
8 12 7 19 E=E\(8,12) T=T U (8,12); D(T)=41+7=46
8 13 7 20 E=E\(8,13) T=T U (8,13); D(T)=48+7=53
9 10 7 21 E=E\(9,10) Tạo nên chu trình
9 11 7 22 E=E\(9,11) T=T U (9,11); D(T)=55+7=60
10 11 7 23 E=E\(10,11) Tạo nên chu trình
10 12 7 24 E=E\(10,12) Tạo nên chu trình
11 12 8 25 E=E\(11,12) Tạo nên chu trình
12 13 8 26 E=E\(12,13) Tạo nên chu trình

Bước 4: Kết Luận


T={(1,2),(1,3),(1,4),(2,6),(2,7),(4,5),(5,10),(6,8),(6,9),(8,12),(8,13),(9,11)};
D(T)=60
 Sử dụng thuật toán Prim
2 bước đầu tương tự Kruskal
Bước 3:
e=(v,t)\v∈V, V\v VH∪v T, D(T)
t∈VT có độ dài
nhỏ nhất

(1,3) 2,4,5,6,7,8,9,10,11,12,13 1,3 T=T U (1,3);

5
D(T)=1
(1,2) 4,5,6,7,8,9,10,11,12,13 1,2,3 T=T U (1,2);
D(T)=1+2=3
(1,4) 5,6,7,8,9,10,11,12,13 1,2,3,4 T=T U (1,4);
D(T)=3+3=6
(2,6) 5,7,8,9,10,11,12,13 1,2,3,4,6 T=T U (2,6);
D(T)=6+5=11
(2,7) 5,8,9,10,11,12,13 1,2,3,4,6,7 T=T U (2,7);
D(T)=11+5=16
(4,5) 8,9,10,11,12,13 ,1,2,3,4,5,6,7 T=T U (4,5);
D(T)=16+5=21
(5,10) 8,9,11,12,13 1,2,3,4,5,6,7,10 T=T U (5,10);
D(T)=21+6=27
(6,8) 9,10,11,12,13 1,2,3,4,5,6,7,8,10 T=T U (6,8);
D(T)=27+6=33
(6,9) 11,12,13 1,2,3,4,5,6,7,8,9,10 T=T U (6,9);
D(T)=35+6=39
(8,12) 11,13 1,2,3,4,5,6,7,8,9,10,12 T=T U (8,12);
D(T)=41+7=46
(8,13) 11 1,2,3,4,5,6,7,8,9,10,12,13 T=T U (8,13);
D(T)=48+7=53
(9,11) Ø 1,2,3,4,5,6,7,8,9,10,11,12,13 T=T U (9,11);
D(T)=55+7=60
Bước 4: Kết Luận
T={(1,2),(1,3),(1,4),(2,6),(2,7),(4,5),(5,10),(6,8),(6,9),(8,12),(8,13),(9,11)};
D(T)=60

 Vũ Đình Du - B21DCVT128
Ví dụ minh họa

6
 Bài toán 1: Xây dựng cây khung bằng thuật toán DFS và BFS bắt đầu
từ đỉnh u=5
 DFS
Các bước thực hiện
Bước Free-DFS(u) T
1 5 T=Ø
2 5,3 T=T∪{(5,3)}
3 5,3,1 T=T∪{(3,1)}
4 5,3,1,2 T=T∪{(1,2)}
5 5,3,1,2,4 T=T∪{(2,4)}
6 5,3,1,2,4,6 T=T∪{(4,6)}
7 5,3,1,2,4,6,7 T=T∪{(6,7)}
8 5,3,1,2,4,6,7,8 T=T∪{(7,8)}
9 5,3,1,2,4,6,7,8,9 T=T∪{(8,9)}
10 5,3,1,2,4,6,7,8,9,10 T=T∪{(9,10)}
11 5,3,1,2,4,6,7,8,9,10,11 T=T∪{(10,11)}
12 5,3,1,2,4,6,7,8,9,10,11,12 T=T∪{(11,12)}
13 5,3,1,2,4,6,7,8,9,10,11,12,13 T=T∪{(12,13)}
Kết luận:
T={(5,3),(3,1),(1,2),(2,4),(4,6),(6,7),(7,8),(8,9),(9,10),(10,11),(11,12),
(12,13)}

7
 BFS
Các bước thực hiện
Bước Free-DFS(u) T
0 5 T=Ø
1 3,6,7,8,9 T=T∪{(5,3),(5,6),(5,7),(5,8),(5,9)}
2 6,7,8,9,1,2,4 T=T∪{(3,1),(3,2),(3,4)}
3 7,8,9,1,2,4 T= T∪(Ø)
4 8,9,1,2,4 T= T∪(Ø)
5 9,1,2,4 T= T∪(Ø)
6 1,2,4,10 T= T∪(9,10)
7 2,4,10 T= T∪(Ø)
8 4,10 T= T∪(Ø)
9 10 T= T∪(Ø)
10 11,12,13 T=T∪{(10,11),(10,12),(10,13)}
11 12,13 T= T∪(Ø)
12 13 T= T∪(Ø)
Kết luận:
T={(5,3),(5,6),(5,7),(5,8),(5,9),(3,1),(3,2),(3,4),(9,10)(10,11),(10,12),
(10,13)}
 Bài toán 2: Xây dựng cây khung nhỏ nhất

Cho đồ thị vô hướng có trọng số G

8
=<V,E> được biểu diễn dưới dạng ma trận
trọng số như hình trên. Xây dựng cây khung nhỏ nhất từ đỉnh 1
 Sử dụng thuật toán Kruskal
- Bước 1:T = Ø ; D(T) = 0
- Bước 2. Sắp xếp các cạnh Bước 3:
theo thứ tự tăng dần của
trọng số:
Đầu Cuối Trọng Số STT Cạnh được xét T U E
1 3 1 1 E\(1,3) T=T U (1,3); D(T)=1
1 2 2 2 E=E\(1,2) T=T U (1,2); D(T)=1+2=3
2 3 2 3 E=E\(2,3) Tạo nên chu trình
1 4 3 4 E=E\(1,4) T=T U (1,4); D(T)=3+3=6
3 4 4 5 E=E\(3,4) Tạo nên chu trình
2 6 5 6 E=E\(2,6) T=T U (2,6); D(T)=6+5=11
2 7 5 7 E=E\(2,7) T=T U (2,7); D(T)=11+5=16
3 6 5 8 E=E\(3,6) Tạo nên chu trình
4 5 5 9 E=E\(4,5) T=T U (4,5); D(T)=16+5=21
4 6 5 10 E=E\(4,6) Tạo nên chu trình
5 6 6 11 E=E\(5,6) Tạo nên chu trình
5 10 6 12 E=E\(5,10) T=T U (5,10); D(T)=21+6=27
6 7 6 13 E=E\(6,7) Tạo nên chu trình
6 8 6 14 E=E\(6,8) T=T U (6,8); D(T)=27+6=33
6 9 6 15 E=E\(6,9) T=T U (6,9); D(T)=33+6=39
6 10 6 16 E=E\(6,10) Tạo nên chu trình
7 8 6 17 E=E\(7,8) Tạo nên chu trình
8 9 7 18 E=E\(8,9) Tạo nên chu trình
8 12 7 19 E=E\(8,12) T=T U (8,12); D(T)=39+7=46
8 13 7 20 E=E\(8,13) T=T U (8,13); D(T)=46+7=53
9 10 7 21 E=E\(9,10) Tạo nên chu trình
9 11 7 22 E=E\(9,11) T=T U (9,11); D(T)=53+7=60
10 11 7 23 E=E\(10,11) Tạo nên chu trình
10 12 7 24 E=E\(10,12) Tạo nên chu trình
11 12 8 25 E=E\(11,12) Tạo nên chu trình
12 13 8 26 E=E\(12,13) Tạo nên chu trình

Bước 4: Kết Luận


T={(1,2),(1,3),(1,4),(2,6),(2,7),(4,5),(5,10),(6,8),(6,9),(8,12),(8,13),(9,11)};
D(T)=60
 Sử dụng thuật toán Prim ( VH =5)
2 bước đầu tương tự Kruskal
Bước 3:
e=(v,t)\v V,t V\v=? VH⋃v=? T, D(T)
V T có độ dài
nhỏ nhất
(5,4) 1,2,3,6,7,8,9,10,11,12,13 4,5 T = T⋃(5,4)
D(T)= 0+5
(1,4) 2,3,6,7,8,9,10,11,12,13 1,4,5 T = T⋃(1,4)
D(T)= 5+3

9
(1,3) 2,6,7,8,9,10,11,12,13 1,3,4,5 T = T⋃(1,3)
D(T)= 8+1
(1,2) 6,7,8,9,10,11,12,13 1,2,3,4,5 T = T⋃(1,2)
D(T)= 9+2
(2,6) 7,8,9,10,11,12,13 1,2,3,4,5,6 T = T⋃(2,6)
D(T)= 11+5
(2,7) 8,9,10,11,12,13 1,2,3,4,5,6,7 T = T⋃(2,7)
D(T)= 16+5
(5,10) 8,9,11,12,13 1,2,3,4,5,6,7,10 T = T⋃(5,10)
D(T)= 21+6
(6,8) 9,11,12,13 1,2,3,4,5,6,7,8,10 T = T⋃(6,8)
D(T)= 27+6
(6,9) 11,12,13 1,2,3,4,5,6,7,8,9,10 T = T⋃(6,9)
D(T)= 33+6
(8,12) 11,13 1,2,3,4,5,6,7,8,9,10,12 T = T⋃(8,12)
D(T)= 39+7
(8,13) 11 1,2,3,4,5,6,7,8,9,10,12,13 T = T⋃(8,13)
D(T)= 46+7
(9,11) ∅ 1,2,3,4,5,6,7,8,9,10,11,12,13 T = T⋃(9,11)
D(T)= 53+7
Bước 4: Kết Luận
T={(1,2),(1,3),(1,4),(2,6),(2,7),(4,5),(5,10),(6,8),(6,9),(8,12),(8,13),(9,11)};
D(T)=60

 Nguyễn Tiến Cường


Bài toán: Cho đồ thị vô hướng G=<V,E>. Hãy xây dựng một cây khung
của đồ thị bắt đầu tại đỉnh u thuộc V
1.Xây dựng cây khung đồ thị dựa vào thuật toán BFS
-Giả sử ta cần xây dựng một cây bao trùm xuất phát tại đỉnh u nào đó.
Trong cả hai trường hợp, mỗi khi ta đến được đỉnh v tức( chuaxet[v]=
False) từ đỉnh u thì cạnh (u,v) được kết nạp vào cây khung.
* Mô tả thuật toán
Begin
Bước 1( Khởi tạo):
T= Ø;// Tập cạnh cây khung ban đầu
Queue= Ø;//Thiết lập hàng đợi ban đầu
Push(Queue,u);//Đưa u vào hàng đợi;
Chuaxet[u]=False;//Bật trạng thái đã xét của đỉnh u
Bước 2(Lặp):
While(Queue!= Ø) do{ // Lặp cho đến khi hàng đợi rỗng
s= Pop(Queue);//Lấy s ra khỏi hàng đợi
for each t ∈ Ke(s) do{ //Lặp trên danh sách Ke(s)
if(chuaxet[t]) then{ // Nếu đỉnh t chua xet
Push(Queue,t);//Đưa t vào hàng đợi

10
T=T⋃(s,t);//Kết nạp (s,t) vào cây khung
Chuaxet[t]=False;//Ghi nhận t đã xét
endif;
endfor;
endwhile;
Bước 3(Trả lại kết quả):
if(T<n-1) <Đồ thị không liên thông>;
else < Ghi nhận tập cạnh T của cây khung>;
end.
*Kiểm nghiệm thuật toán
-Kiểm nghiệm thuật toán với đỉnh bắt đầu u=1 trên đồ thị biểu diễn dưới
dạng ma trận kề dưới đây

-Các bước thực hiện thuật toán được thực hiện trong bảng sau:
Bước Trạng thái hàng đợi T
1 1 T= Ø
2 2,3,4 T=T ⋃{(1,2),(1,3),(1,4)}
3 3,4 T=T ⋃ Ø
4 4,5 T=T ⋃(3,5)
5 5 T=T ⋃ Ø
6 6,7,8,9 T=T ⋃{(5,6),(5,7),(5,8),(5,9)}
7 7,8,9 T=T ⋃ Ø
8 8,9 T=T ⋃ Ø
9 9 T=T ⋃ Ø
10 10 T=T ⋃(9,10)
11 11,12,13 T=T ⋃{(10,11),(10,12),
(10,13)}
12 12,13 T=T ⋃ Ø
13 13 T=T ⋃ Ø
14 Ø T=T ⋃ Ø

11
Vậy T={(1,2),(1,3),(1,4),(3,5),(5,6),(5,7),(5,8),(5,9),(10,11),(1012),
(10,13)}
2.Xây dựng cây khung đồ thì dựa vào thuật toán DFS
-Giả sử ta cần xây dựng một cây bao trùm xuất phát tại đỉnh u nào đó.
Trong cả hải trường hợp, mỗi khi ta đến được đỉnh v tưc
(chuaxet[v]=False) từ đỉnh u thì cạnh (u,v) được kết nạp vào khung.
*Mô tả thuật toán
void Tree-DFS(u){
chuaxet[u] = False; //Bật trạng thái đỉnh u từ True trở thành False
for v∈Ke(u) { // Duyệt trên danh sách kề của đỉnh u
if (chuaxet[v]) { //Nếu đỉnh v chưa được xét đến
T = T ⋃ (u,v); //Hợp cạnh (u,v) vào cây khung
Tree-DFS(v); // Duyệt theo chiều sâu bắt đầu tại đỉnh
v
}
}
Khi đó, quá trình xây dựng cây khung bắt đầu tại đỉnh u được thưc hiện
như thuật toán sau:
Void Tree-Graph-DFS(){
for each u∈V do // Khởi tạo các đỉnh chưa xét
chuaxet[u] = True;
endfor;
roof = < Đỉnh bất kỳ của đồ thị>; //Lấy một đỉnh bất kỳ làm gốc
T = Ø; // Thiết lập tập cạnh ban đầu của cây là Ø
Tree-DFS(roof); // Thực hiện giải thuật DFS
If (T< n-1)<Đồthị không liên thông>;
else <Ghi nhận tập cạnh T của cây khung>
*Kiểm nghiệm thuật toán
-Kiểm nghiệm thuật toán với đỉnh bắt đầu u=1 trên đồ thị được biểu diễn
dưới dạng ma trận kề sau

-Các bước thực hiện thuật toán được thực hiện trong bảng sau:
Bước Tree-DFS(u) T=?

12
1 1 T=T Ø
2 1,2 T=T ⋃ (1,2)
3 1,2,3 T=T ⋃ (2,3)
4 1,2,3,4 T=T ⋃ (3,4)
5 1,2,3,4,5 T=T ⋃ (3,5)
6 1,2,3,4,5,6 T=T ⋃ (5,6)
7 1,2,3,4,5,6,7 T=T ⋃ (6,7)
8 1,2,3,4,5,6,7,8 T=T ⋃ (7,8)
9 1,2,3,4,5,6,7,8,9 T=T ⋃ (8,9)
10 1,2,3,4,5,6,7,8,9,10 T=T ⋃ (9,10)
11 1,2,3,4,5,6,7,8,9,10,11 T=T ⋃ (10,11)
12 1,2,3,4,5,6,7,8,9,10,11,12 T=T ⋃ (11,12)
13 1,2,3,4,5,6,7,8,9,10,11,12,13 T=T ⋃ (12,13)

Vậy T= {(1,2),(2,3),(3,4),(3,5),(5,6),(6,7),(7,8),(8,9),(9,10),(10,11),(11,12),
(12,13)}

13
 Nguyễn Mạnh Dũng
Các thuật toán tìm cây khung nhỏ nhất
1. Thuật toán Kruskal
Ý tưởng thuật toán: Ban đầu mỗi đỉnh là một cây riêng biệt, ta tìm cây
khung nhỏ nhất bằng cách duyệt các cạnh theo trọng số từ nhỏ đến lớn,
rồi hợp nhất các cây lại với nhau.
Cụ thể hơn, giả sử cạnh đang xét nối 2 đỉnh u và v, nếu 2 đỉnh này nằm ở
2 cây khác nhau thì ta thêm cạnh này vào cây khung, đồng thời hợp nhất
2 cây chứa u và v.
Giả sử ta cần tìm cây khung nhỏ nhất của đồ thị G. Thuật toán bao gồm
các bước sau:
 Khởi tạo rừng F (tập hợp các cây), trong đó mỗi đỉnh của G tạo thành
một cây riêng biệt.
 Khởi tạo tập S chứa tất cả các cạnh của G.
 Chừng nào S còn khác rỗng và F gồm hơn một cây
o Xóa cạnh nhỏ nhất trong S
o Nếu cạnh đó nối hai cây khác nhau trong F, thì thêm nó vào F và hợp hai
cây kề với nó làm một
o Nếu không thì loại bỏ cạnh đó.
Khi thuật toán kết thúc, rừng chỉ gồm đúng một cây và đó là một cây
khung nhỏ nhất của đồ thị G

Ví dụ thuật toán Krusal

 Cho đồ thị G như hình vẽ:. Yêu cầu tìm ra cây khung nhỏ nhất của đồ
thị G.
 G gồm có 7 đỉnh

14
 Đồ thị G có n phần tử. Thuật toán Kruskal sẽ dừng khi có n-1 trong
tập hợp T
o n=7
o Vậy số cạnh trong tập hợp T: n - 1 = 7 - 1 = 6(*)

Đồ thị G

Bước 1: Liệt kê tất cả cạnh với trọng số của cạnh đó: Dựa vào đồ thị ta liệt
kê ra các cạnh gồm đỉnh đầu, đỉnh cuối và trọng số:

Điểm đầu Điểm cuối Trọng số

1 2 3

1 4 1

1 6 3

2 3 4

2 6 6

3 4 3

15
3 5 7

3 7 5

4 5 6

4 6 2

5 6 5

6 7 1

Bước 2: Sắp xếp các cạnh theo trọng số tăng dần:

Điểm đầu Điểm cuối Trọng số

1 4 1

6 7 1

4 6 2

1 2 3

1 6 3

3 4 3

2 3 4

3 7 5

16
5 6 5

2 6 6

4 5 6

3 5 7

Bước 3: Dựa vào kết quả ở bước 2. Ta tiến hành tìm cây khung bằng
thuật toán Kruskal

Kết quả Cạnh đang xét

1-4-1: Ta nhận thấy cạnh 1-4 không tạo ra một


chu trình nào. Vì vậy, thêm 1-4 vào tập hợp

Đồ
thị G

6-7-1: Ta nhận thấy cạnh 6-7 không tạo ra một


chu trình nào. Vì vậy, thêm 6-7 vào tập hợp

Đồ
thị G

17
4-6-2: Ta nhận thấy cạnh 4-6 không tạo ra một
chu trình nào. Vì vậy, thêm 4-6 vào tập hợp

Đồ
thị G

1-2-3: Ta nhận thấy cạnh 1-2 không tạo ra một


chu trình nào. Vì vậy, thêm 1-2 vào tập hợp

Đồ
thị G

1-6-3: Ta nhận thấy cạnh 1-6 tạo ra một chu


trình. Không thêm vào tập hợp.

3-4-3: Ta nhận thấy cạnh 3-4 không tạo ra một


chu trình. Vì vậy, thêm 3-4 vào tập hợp

Đồ
thị G

2-3-4: Ta nhận thấy cạnh 2-3 tạo ra một chu


trình. Không thêm vào tập hợp.

Đồ
thị G

18
3-7-5: Ta nhận thấy cạnh 3-7 tạo ra một chu
trình. Không thêm vào tập hợp.

Đồ
thị G

5-6-5: Ta nhận thấy cạnh 5-6 không tạo ra một


chu trình nào. Vì vậy, thêm 5-6 vào tập hợp

Đồ
thị G

 Đến đây, ta đã tìm được 6 cạnh. Vậy kết thúc thuật toán. (Thỏa (*))
 Kết quả: Ta được đồ thị sau

Đồ thị G
Với tổng chi phí là: Ta cộng tất cả các trọng số giữa các đỉnh lại với nhau

 Vậy tổng chi phí: 3 + 1 + 3 + 2 + 5 + 1 = 15

19
 Nguyễn Khánh Duy
VD1:Cho đồ thị vô hướng được biểu diễn bằng ma trận kề như hình dưới
đây, Áp dụng thuật toán xây dựng cây khung của đồ thị sử dụng BFS cho
đồ thị trên bắt đầu từ đỉnh u = 1.
0 1 1 1 0 0 0 0 0 0 0 0 0
1 0 1 1 0 0 0 0 0 0 0 0 0
1 1 0 1 1 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 1 1 1 1 0 0 0 0
0 0 0 0 1 0 1 0 1 0 0 0 0
0 0 0 0 1 1 0 1 0 0 0 0 0
0 0 0 0 1 0 1 0 1 0 0 0 0
0 0 0 0 1 1 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 1
0 0 0 0 0 0 0 0 0 1 1 0 1
0 0 0 0 0 0 0 0 0 1 1 1 0

Bướ Trạng thái hàng đợi T


c
0 1 T=∅
1 1, 2 T = T ∪ {(1,2)}
2 1, 2, 3 T = T ∪ {(2,3)}
3 1, 2, 3, 4 T = T ∪ {(3,4)}
4 1, 2, 3
5 1, 2, 3, 5 T = T ∪ {(3,5)}
6 1, 2, 3, 5, 6 T = T ∪ {(5,6)}
7 1, 2, 3, 5, 6, 7 T = T ∪ {(6,7)}
8 1, 2, 3, 5, 6, 7, 8 T = T ∪ {(7,8)}
9 1, 2, 3, 5, 6, 7, 8, 9 T = T ∪ {(8,9)}
10 1, 2, 3, 5, 6, 7, 8, 9, 10 T = T ∪ {(9,10)}
11 1, 2, 3, 5, 6, 7, 8, 9, 10, 11 T = T ∪ {(10,11)}
12 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12 T = T ∪ {(11,12)}
13 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, T = T ∪ {(12,13)}

20
13
Không thêm được cạnh nào nữa vào T
T= {(1,2),(2,3),(3,4),(3,5),(5,6), (6,7), (7,8), (8,9), (9,10), (10,11),
(11,12), (12,13)}

VD2: Cho đồ thị vô hướng được biểu diễn bằng ma trận kề như hình
dưới đây, Áp dụng thuật toán xây dựng cây khung của đồ thị sử dụng
BFS cho đồ thị trên bắt đầu từ đỉnh u = 1.
0 1 1 1 0 0 0 0 0 0 0 0 0
1 0 1 1 0 0 0 0 0 0 0 0 0
1 1 0 1 1 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 1 1 1 1 0 0 0 0
0 0 0 0 1 0 1 0 1 0 0 0 0
0 0 0 0 1 1 0 1 0 0 0 0 0
0 0 0 0 1 0 1 0 1 0 0 0 0
0 0 0 0 1 1 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 1
0 0 0 0 0 0 0 0 0 1 1 0 1
0 0 0 0 0 0 0 0 0 1 1 1 0

Bướ Trạng thái hàng đợi T


c
0 1 T=∅
1 2, 3, 4 T = T ∪ {(1,2), (1,3), (1,4)}
2 3, 4
3 4, 5 T = T ∪ {(3,5)}
4 5
5 6, 7, 8, 9 T = T ∪ {(5,6),(5,7),(5,8),(5,9)}
6 7, 8, 9
7 8, 9
8 9
9 10 T = T ∪ {(9,10)}
10 11, 12, 13 T = T ∪ {(10,11),(10,12),(10,13)}
11 12, 13
12 13
13 ∅
T= {(1,2),(1,3), (1,4), (3,5), (5,6), (5,7), (5,8), (5,9), (9,10), (10,11),
(10,12), (10,13)}

21
Thuật toán Kruskal:
- 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 sẽ 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.
Thuật toán sẽ được thực hiện như sau:
Kruskal(){
T = ∅;
d(H) = 0; <sap xep cac canh do thi theo thu tu tang dan cua trong
so>;
while(|T| < n – 1 &&E ≠ ∅){
e = <canh co do dai nho nhat>;
E = E \ {e};
if(T ∪ {e} khong tao nen chu trinh) {
T = T ∪ {e};
d(H) = d(H) + d(e);
}
}
if(|T| < n – 1) <do thi khong lien thong>;
else return(T,d(H));
}

22
VD3: Cho đơn đồ thị vô hướng G = <V,E> được biểu diễn dưới dạng ma
trận trọng số như sau:
0 4 1 1 2 9  5 4 7
4 0 2  9 1 5  6 
1 2 0 7  6 6 1 1 9
1  7 0 1 7  6  
2 9  1 0 3 4 3 1 2
9 1 6 7 3 0 3 1 1 5
 5 6  4 3 0 4 5 
5  1 6 3 1 4 0 4 2
4 6 1  1 1 5 4 0 4
7  9  2 5  2 4 0

Hãy thực hiện:


1. Áp dụng thuật toán Kruskal, tìm cây khung nhỏ nhất của đồ thị G
đã cho, chỉ rõ kết quả tại mỗi bước thực hiện theo thuật toán?

Đầu Cuối Trọng số STT Cạnh được xét T∪e


1 3 1 1 (1,3) d(T)= 1
1 4 1 2 (1,4) d(T)= 2
2 6 1 3 (2,6) d(T)= 3
3 7 1 4 (3,7) d(T)= 4
4 5 1 5 (4,5) d(T)= 5
5 9 1 6 (5,9) d(T)= 6
1 2 2 7 (6,7) d(T)= 9
2 3 2 8 (6,8) d(T)= 12
5 10 2 9 (6,10) d(T)= 17
6 7 3 10 (1,2) d(T)= 19
6 8 3 11 (3,9) d(T)= 25
7 8 4 12 (4,6) d(T)= 32
8 9 4 13 (2,3) d(T)= 34
6 10 5 14 (5,10) d(T)= 36
3 9 6 15 (7,8) d(T)= 40
4 6 7 16 (8,9) d(T)= 44

Kết luận: T={(1,3),(1,4),(2,6),(3,7),(4,5),(5,9),(6,7),(6,8),(6,10),(1,2),(3,9),(4,6),(2,

23
Thuật toán Prim:
- Duy trì hai tập đỉnh VH (tập đỉnh của cây khung) V (tập các đỉnh
chưa nằm trong cây khung). Ban đầu VH = {s}, s là một đỉnh bất kì
của đồ thị. V bằng tập đỉnh của đồ thị trừ đi s.
- Mỗi bước chọn cạnh có trọng số nhỏ nhất và có 1 đỉnh trong VH và
1 đỉnh trong V. Đưa cạnh này vào cây khung và đưa đỉnh liền kề
với cạnh này từ V sang VH.
- Thuật toán sẽ dừng lại khi cây khung có đủ (n – 1) cạnh hoặc
không còn đỉnh nào trong V.

Thuật toán sẽ được thực hiện như sau:


Prim(s){
VH = {s};
V = V \ {s};
T = ∅;
d(H) = 0;
while(V ≠ ∅){
e = (u,v);
if(khong tim duoc e) return<do thi khong lien thong>;
T = T ∪ {e};
d(H) = d(H) + d(e);
VH = VH ∪ {u};
V = V \ {u};
}
return (T,d(H));
}

24
VD4: Cho đơn đồ thị vô hướng G = <V,E> được biểu diễn dưới dạng ma
trận trọng số như sau:
 2   7 9       9
2  6  6 9       
 6  5 6      9  
  5  1  9 5  5 5  
7 6 6 1  6 6      
9 9   6  6      
   9 6 6  5     
   5   5  3 3   
       3  3   
   5    3 3  3 3 9
  9 5      3  3 
        4 3 3  2
9        4 9  2 

Hãy thực hiện:


1. Áp dụng thuật toán Prim, tìm cây khung nhỏ nhất của đồ thị G bắt
đầu tại đỉnh u = 1, chỉ rõ kết quả theo từng bước thực hiện của
thuật toán

25
E=(s,t) V\v= VT ∪ v = T, d(T)
Khởi tạo 2,3,4,5,6,7,8,9,10,11,12,13 1 T = ∅; d(T) = 0
(1,6) 2,3,4,5,7,8,9,10,11,12,13 1,6 T = T ∪ (1,6);
d(T) = 0 + 1 = 1
(1,2) 3,4,5,7,8,9,10,11,12,13 1,2,6 T = T ∪ (1,2);
d(T) = 1 + 2 = 3
(2,3) 4,5,6,7,8,9,10,11,12,13 1,2,3,6 T = T ∪ (2,3);
d(T) = 3+6 = 9
(3,4) 5,7,8,9,10,11,12,13 1,2,3,4,6 T = T ∪ (3,4);
d(T) = 9 + 5 = 14
(4,5) 7,8,9,10,11,12,13 1,2,3,4,5,6 T = T ∪ (4,5);
d(T) = 14 + 1 = 15
(4,8) 7,9,10,11,12,13 1,2,3,4,5,6,8 T = T ∪ (5,8);
d(T) = 15 + 5 = 20
(8,9) 7,10,11,12,13 1,2,3,4,5,6,8,9 T = T ∪ (8,9);
d(T) = 20+ 3 = 23
(8,10) 7,11,12,13 1,2,3,4,5,6,8,9,10 T = T ∪ (8,10);
d(T) = 23 + 3 = 26
(10,11) 7,12,13 1,2,3,4,5,6,8,9,10,11 T = T ∪ (10,11);
d(T) = 26 + 3 = 29
(10,12) 7,13 1,2,3,4,5,6,8,9,10,11,12 T = T ∪ (10,12);
d(T) = 29 + 3 = 32
(11,13) 7 1,2,3,4,5,6,8,9,10,11,12,13 T = T ∪ (12,13);
d(T) = 32 + 2 = 34
(7,8) ∅ 1,2,3,4,5,6,7,8,9,10,11,12,13 T = T ∪ (7,8);
d(T) = 34 + 5 = 39

T = {(1,2), (1,6),(2,3), (3,4), (4,5), (4,8), (7,8), (8,9), (8,10), (10,11),


(10,12), (11,13) => d(T)= 39

26

You might also like