Professional Documents
Culture Documents
Trang 1
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
Người ta còn gọi cây khung là: cây bao trùm hay cây tối đại.
Ví dụ: 2 cây khung của đồ thị G
Trang 2
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
Bắt đầu từ đỉnh root v=1, thứ tự các đỉnh được duyệt như sau:
10
9
2 4
8
3
1
6 5 7
Trang 3
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
for (v ∈ V) ChuaXet[v] = 1;
T = ∅;
Tree_DFS(root); //root là đỉnh nào đó của đồ thị
}
2.2.2. Xây dựng cây khung theo chiều rộng
Ý tưởng: Bắt đầu từ một đỉnh v bất kỳ (mức 0), duyệt đỉnh v. Sau đó duyệt
các đỉnh kề (mức 1) của v. Tiếp tục duyệt các đỉnh kề (mức 2, mà chưa duyệt) của
các đỉnh mức 1 (theo thứ tự đã duyệt trước đó). Mỗi lần duyệt, đưa cạnh nối từ
đỉnh kề mức sau với đỉnh mức kế trước vào cây T. Cứ tiếp tục cho đến hết mức.
Ví dụ:
Mức 2 Mức 4
Mức 1 10
9
2 4
Mức 3
8
1
3
7
6 5
- Bắt đầu duyệt từ đỉnh 1 (mức 0).
- Duyệt các đỉnh kề (mức 1) của đỉnh 1: duyệt 2, 3. Đưa các cạnh (1,2),
(1,3) vào T.
- Duyệt các đỉnh kề (mức 2) của các đỉnh mức 1: duyệt 4, 5, 6. Đưa các
cạnh (2,4), (3,5), (3,6) vào T.
- Duyệt các đỉnh kề (mức 3) của các đỉnh mức 2: duyệt 7, 8. Đưa các cạnh
(4,7), (4,8) vào T.
- Duyệt các đỉnh kề (mức 4) của các đỉnh mức 3: duyệt 9, 10. Đưa các cạnh
(8,9), (8,10) vào T.
Thứ tự các đỉnh đã được duyệt như sau:
1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10
Trang 4
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
Kết quả T gồm các cạnh {(1, 2), (1, 3), (2, 4), (3, 5), (3, 6), (4, 7), (4, 8),
(8, 9), (8, 10) }. T là cây sau
Sử dụng hàng đợi QUEUE: Bắt đầu từ một đỉnh v bất kỳ, duyệt đỉnh v, sau
đó đưa các đỉnh u chưa duyệt mà kề v vào cuối hàng đợi, và đưa các cạnh (u,v)
vào T. Tiếp theo, lấy đỉnh u ở đầu hàng đợi, duyệt u và làm tương tự giống như
với v.
Mã giả cho thuật toán:
void Tree_BFS(v)
{
QUEUE = ∅;
QUEUE ⇐ v; //đưa v vào hàng đợi
ChuaXet[v] = 0; //v đã xét
while (QUEUE != ∅) //Nếu hàng đợi chưa rỗng
{
v ⇐ QUEUE; //lấy phần tử v ở đầu hàng đợi
for (u ∈ Ke(v)) //với mỗi u kề với v
if (ChuaXet[u]) //nếu u chưa xét
{
QUEUE ⇐ u; //đưa u vào cuối hàng đợi
ChuaXet[u] = 0; // u đã xét
T = T ∪ (v,u); //đưa cạnh (v,u) vào cây T
};
Trang 5
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
}
}
void main()
{
for (v ∈ V) ChuaXet[v] = 1;
T = ∅;
Tree_DFS(root); //root là đỉnh nào đó của đồ thị
}
Ví dụ:
Mức 2 Mức 4
Mức 1 10
9
2 4
Mức 3
8
1
3
7
6 5
- Diễn giải ngắn gọn: Bắt đầu duyệt từ đỉnh 1 (mức 0). Nội dung hàng đợi
sẽ thay đổi như sau. Mỗi cột là nội dung của QUEUE sau mỗi lần duyệt 1 đỉnh.
Duyệt 1 2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 10
6 7 8
8
Thứ tự các đỉnh đã được duyệt như sau:
1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10
Kết quả T gồm các cạnh {(1, 2), (1, 3), (2, 4), (3, 5), (3, 6), (4, 7), (4, 8),
(8, 9), (8, 10) }. T là cây sau
Trang 6
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
Trang 7
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
- Chọn cạnh nhỏ nhất (a,f) cho vào T (không tạo chu trình), xóa khỏi G:
Trang 8
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
b
c
12 24
5
a d
4 7
3
1
f 20
e
- Chọn cạnh nhỏ nhất (f,b) cho vào T (không tạo chu trình), xóa khỏi G:
b
c
12 24
5
a d
4 7
3
1
f 20
e
- Chọn cạnh nhỏ nhất (c,d) cho vào T (không tạo chu trình), xóa khỏi G:
b
c
12 24
5
a d
4 7
3
1
f 20
e
- Chọn cạnh nhỏ nhất (c,e) cho vào T sẽ tạo chu trình, do đó không thêm
vào T, xóa khỏi G.
- Chọn cạnh nhỏ nhất (a,b) cho vào T sẽ tạo chu trình, do đó không thêm
vào T, xóa khỏi G.
Trang 9
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
b
c
12 24
5
a d
4 7
3
1
f 20
e
- Chọn cạnh nhỏ nhất (e,f) cho vào T (không tạo chu trình), xóa khỏi G.
b
c
12 24
5
a d
4 7
3
1
f 20
e
Trang 10
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
Việc kiểm tra đồ thị không chứa chu trình không hề đơn giản, mà thuật toán
phải kiểm tra trong mỗi vòng lặp. Do đó, có thể tiếp cận bằng cách xây dựng “dần
dần” cây khung nhỏ nhất theo cách sau:
- Coi đồ thị ban đầu có n đỉnh và không có cạnh: một rừng gồm n cây.
- Mỗi lần thêm vào một cạnh theo thứ tự trọng số tăng dần, sao cho 2 đầu
mút của cạnh mới được thêm phải nằm ở 2 cây khác nhau.
- Thuật toán sẽ dừng lại khi có n - 1 cạnh được thêm.
Có đỉnh b∉VT nối với a∈VT; Có đỉnh c,e∉VT nối với f∈VT. Cạnh (e,f)
nhỏ nhất nên chọn nó vào T.
Trang 11
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
b c
12 24
5
a 4 d
7
3
1
f 2
e
Có đỉnh b∉VT nối với a∈VT; Có đỉnh c ∉VT nối với e,f∈VT; Có đỉnh d
∉VT nối với e∈VT. Cạnh (d,e) nhỏ nhất nên chọn nó vào T.
b c
12 24
5
a 4 d
7
3
1
f 2
e
Có đỉnh b∉VT nối với a∈VT; Có đỉnh c ∉VT nối với d,e,f∈VT. Cạnh (c,f)
nhỏ nhất nên chọn nó vào T.
b c
12 24
5
a 4 d
7
3
1
f 2
e
Có đỉnh b∉VT nối với b,c∈VT. Cạnh (b,a) nhỏ nhất nên chọn nó vào T.
Trang 12
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
b c
12 24
5
a 4 d
7
3
1
f 2
e
- Thuật toán dừng lại khi có n - 1 cạnh được chọn (hoặc VT = V).
b c
12 24
5
a 4 d
7
3
1
f 2
e
Trang 13
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
đoạn không đảm bảo tạo ra lời giải tối ưu toàn cục. Nhưng 2 thuật toán này đều
là các thuật toán tham lam tạo các lời giải tối ưu toàn cục.
- Thuật toán Kruskal làm việc kém hiệu quả với các đồ thị dày (m ≥ n(n-
1)/2, m là số cạnh, n là số đỉnh đồ thị).
- Tìm cây khung lớn nhất: tạm đổi dấu các trọng số, rồi áp dụng thuật toán
tìm cây khung nhỏ nhất, sau đó đổi dấu lại các trọng số trên cây kết quả.
Trang 14
LÝ THUYẾT ĐỒ THỊ
GV: Hồ Ngọc Thanh
BÀI TẬP
1. Hãy vẽ tất cả các cây khung của đồ thị sau
a b a b
e d c d
2. Áp dụng thuật toán Kruskal, tìm cây khung nhỏ nhất cho đồ thị sau
3
10
2 -3 6
2 4 5
15
6 13 1
-1
1 2
9 7 4
3. Áp dụng thuật toán Prim tìm cây khung nhỏ nhất cho đồ thị sau. Đỉnh chọn
đầu tiên là đỉnh 3.
2
4
2
9 6
1
3
5
1
1 5
1 2 3
4 7
4 9 5
Trang 15