Professional Documents
Culture Documents
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
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
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
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
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
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ố:
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
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
Đồ
thị G
Đồ
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
Đồ
thị G
Đồ
thị G
Đồ
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
Đồ
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
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
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
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
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.
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
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
26