Professional Documents
Culture Documents
T1
T2
❑Định lý 1: Giữa 2 đỉnh bất kỳ trong cây T luôn có
một và chỉ một đường đi trong T nối chúng
3
❖ Định nghĩa: Cây có gốc (rooted tree) là một cây
có hướng, trên đó đã chọn một đỉnh là gốc (root)
của cây và các cạnh định hướng sao cho với mọi
đỉnh luôn có một đường đi từ gốc đến đỉnh đó
Cây có gốc
Xét cây có gốc T
- Mức của đỉnh: Khoảng cách từ gốc đến nút đó
- Chiều cao của cây: Mức lớn nhất của một đỉnh bất kỳ
root Mức 0
Mức 3
7
⦁ Cho cây có gốc T:
o Nếu số cây con tối đa của
một đỉnh trong T là m và
có ít nhất một đỉnh đúng
m cây con thì T gọi là cây
m-phân (m-arytree)
o Nếu mọi đỉnh trong của T Cây tam phân
đều có đúng m cây con thì
T gọi là cây m-phân đủ
(complete m-arytree)
o Cây m-phân với m=2 gọi
Cây nhị phân đủ
là cây nhị phân
8
❖ Định lý 3 (Định lý Daisy Chain): T là một đồ thị có
n đỉnh (n>=2), các mệnh đề sau là tương đương
1. T là cây
2. T liên thông và có n-1 cạnh
3. T không chứa chu trình và có n-1 cạnh
4. T Liên thông và mỗi cạnh là cầu
5. Giữa 2 đỉnh phân biệt bất kỳ của T luôn tồn có
duy nhất một đường đi đơn.
6. T không chứa chu trình nhưng khi thêm một
cạnh mới thì có được một chu trình duy nhất.
9
❖ Định lý 4: Một cây m-phân đầy đủ, có i đỉnh
trong thì có n= m*i+1 đỉnh (n số đỉnh, m số
cây con của mỗi đỉnh trong)
• Hệ luận: T là một cây m-phân đầy đủ
i. T có i đỉnh trong T có l = (m-1)*i+1 nút lá
ii. T có l nút lá T có i = (l-1)/(m-1) đỉnh
trong và n = (m*l-1)/(m-1) đỉnh
iii. T có n đỉnh T có i = (n-1)/m đỉnh
trong và l = [(m-1)n+1]/m nút lá
10
• Hệ luận: T là một cây m-phân đầy đủ
iv. Một cây m-phân có chiều cao h thì có
nhiều nhất là mh n ú t lá
v. Một cây m-phân có l nút lá thì có chiều cao
h ≥[logml]
vi. Một cây m-phân đầy đủ, cân bằng có l nút
lá thì có chiều cao h=[logml]
11
⦁ Hãy xác định hệ số m của cây m-phân bên dưới
12
Xét cây có gốc T, gọi Tr1, Tr2,…,Trk lần lượt là các cây
con của nút r theo thứ tự từ trái qua phải
T1 T2 … Tk
13
2.1. Duyệt cây theo thứ tự trước (preoder : Root -
Left Subtree – right Subtree)
• Thăm gốc r của T
• Đệ quy: duyệt từng cây con lần lượt từ T1 đến
Trk theo thứ tự trước
Ví dụ: Kết quả duyệt theo
Preorder?
14
ABEJKNOPFCDGLMHI
15
2.2. Duyệt cây theo thứ tự giữa (inoder) (left subtree
– root – right subtree)
- Duyệt Tr1 theo thứ tự giữa
- Thăm r
- Duyệt Tr2theo thứ tự giữa,…, duyệt Trk theo thứ
tự giữa
Ví dụ: Kết quả duyệt theo
Inorder?
16
JENKOPBFACLGMDHI
17
2.3. Duyệt cây theo thứ tự sau (postorder : left
subtree – right subtree - root)
• Duyệt Tr1 theo postorder, duyệt Tr2 theo
postorder,…, duyệt Trk theo postorder
• Thăm r
Ví dụ: Kết quả duyệt theo postorder?
18
JNOPKEFBCLMGHIDA
19
BÀI TẬP
Cho cây nhị phân như hình vẽ:
1 5 1 5
8 8
6 6
7 7
1 5 D
C B
A
8
6
C
7
H liên thông H có
G không liên thông G không có cây bao trùm
cây bao trùm 24
Tìm cây khung là việc xây dựng một cây chứa
tất cả các đỉnh của đồ thị
Hai phương pháp
❖ Tìm theo chiều sâu (DFS: Depth First Search)
❖ Tìm theo chiều rộng (BFS: Breadth First Search)
Bước 1: Chọn một đỉnh bất kỳ v của G làm điểm
xuất phát (gốc) của T.
Bước 2:Xác định một đường đi sơ cấp xuất
phát từ v qua các đỉnh G nhưng T, cho
đến khi không thể đi tiếp. Gọi k là đỉnh kết
thúc đường đi. Đặt đường đi này vào T rồi
quay trở về đặt đỉnh liền trước k làm điểm
xuất phát. Lập lại thủ tục này cho đến khi
mọi đỉnh của G đều nằm trong T.
24
25
DFS(G: Liên thông với các đỉnh v1,v2,…,vn){
T=Cây chỉ gồm 1 đỉnh v1 visit(v1)
}
Visit(v: đỉnh của G){
- For (mỗi đỉnh w kề với v nhưng chưa
có trong T)
- Thêm đỉnh w và cạnh (v,w) vào T
visit(w);
}
26
4 4
3 3
2 2
1 5 1 5
8 8
6 6
7 7
9 9
27
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3
3 1 1 0 1 0 0 1 6
1 4
4 0 1 1 0 0 1 1
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0 5
7
7 1 0 1 1 1 0 0
28
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
1 4
4 0 1 1 0 0 1 1
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
29
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
1 4
4 0 1 1 0 0 1 1
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
30
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
4 0 1 1 0 0 1 1 1 4
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
31
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
1 4
4 0 1 1 0 0 1 1
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
32
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
1 4
4 0 1 1 0 0 1 1
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
33
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
4 0 1 1 0 0 1 1 1 4
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
34
1 2 3 4 5 6 7 2
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0
3 1 1 0 1 0 0 1 3
6
1 4
4 0 1 1 0 0 1 1
5 0 0 0 0 0 0 1
6 0 1 0 1 0 0 0
7 1 0 1 1 1 0 0 7 5
35
Cây bao trùm tìm được
2
1 2 3 4 5 6 7
1 0 1 1 0 0 0 1
2 1 0 1 1 0 1 0 3 6
3
1 1 0 1 0 0 1 1 4
0 1 1 0 0 1 1
4
0 0 0 0 0 0 1
5
6
0 1 0 1 0 0 0
7 5
7 1 0 1 1 1 0 0
36
Bài tập: Tìm cây bao trùm theo phương pháp
DFS cho đồ thị bên dưới, bắt đầu từ đỉnh 1,
ghi cụ thể từng bước
37
Tìm cây bao trùm theo phương pháp
– BFS (Breadth First Search)
1) Chọn 1 đỉnh bất kỳ của G làm đỉnh xuất phát
(gốc) của T.
2) Đặt mọi cạnh nối gốc với 1 đỉnh T vào T.
Lần lượt xét từng đỉnh con trực tiếp của gốc.
Xem đỉnh này là gốc mới, lặp lại thủ tục này
cho đến khi mọi đỉnh của G đều2 nằm trong T.
3
6
1 4
7 5
38
Tìm cây bao trùm theo phương pháp
– BFS (Breadth First Search)
39
Tìm cây bao trùm theo phương pháp
– BFS (Breadth First Search)
BFS(G: liên thông với tập đỉnh v1,v2,...,vn) {
T:= Cây chỉ gồm 1 đỉnh v1;
Q={v}//Queue: các đỉnh chưa xử lý
while (Q≠){
v = Q.Remove();
for (mỗi đỉnh w kề với v)
if w Q and wT{
Q.Add(w)
Thêm cạnh (v,w) vào T
}
}
} 40
Tìm cây bao trùm theo phương
pháp
2 –BFS (Breadth First
2 Search)
3 3
6 6
1 4 1 4
7 5 7 5
2
2
3
6 3
1 4 6
1 4
7 5
7 5
Tìm cây bao trùm theo phương pháp
– BFS (Breadth First Search)
3 3
2 6 2 6
1 4 1 4
5 5
42
Tìm cây bao trùm theo phương pháp
– BFS (Breadth First Search)
Bài tập: Tìm cây bao trùm theo phương pháp
BFS cho đồ thị bên dưới, bắt đầu từ đỉnh A,
ghi cụ thể từng bước
43
Tìm cây bao trùm theo phương pháp – BFS
(Breadth First Search)
44
❖ Đồ thị có trọng số: Là đồ thị trong đó mỗi
cạnh (cung) được gán thêm một số thực
gọi là trọng số (weight) của cạnh (cung)
Kí hiệu:
c(e): Trọng số của cạnh e
c(G): Trọng số của đồ thị G B
D
9
8
A
4 3
5
C
45
❖ Ma trận kề của đồ thị có trọng số: Cho
G=<V,E> có trọng số, ma trận kề trọng số
của G là ma trận A có kích cỡ |V||V| trong
đó mỗi phần tử aij có giá trị như sau:
Trọng số của cạnh/cung i(vj ,v ) nếui (v
j ,v )E
aij =
Nếu (vi,vj)E
A B C D
D
B 9 A 8 5
8
A B 8 4 9
4 3 5 4 3
5 C
D 9 3
C 44
❖ Bài toán: Cho G là đồ thị liên thông, có
trọng số. Hãy tìm một cây bao trùm của G
có trọng số nhỏ nhất
D D
B 9 B
8 A
A
4 4 3
3 5
5
C C
47
❖ Định lý: Cho T là một cây bao trùm của đồ thị
có trọng số G liên thông. T là một cây bao
trùm tối thiểu nếu và chỉ nếu mỗi cạnh eT
đều có trọng số lớn nhất trên chu trình tạo bởi
e và các cạnh của T
D D
B
8
B 9 9
A A
4 4 3
3 5
5
C C
48
Thuật toán tìm cây khung có trọng
số nhỏ nhất
51
Ví dụ: Tìm cây bao trùm nhỏ
nhất của đồ thị bên dưới bằng
thuật toán Kruskal, ghi ra kết
quả từng bước chạy.
•G gồm có 9 đỉnh
•Đồ 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
• n=9
• Vậy số cạnh trong tập
hợp T: n – 1 = 9 – 1 = 8(*)
• Bước 1: Liệt
Đỉnh đầu Đỉnh cuối Trọng số
kê tất cả cạnh 1 2 8
với trọng số 1 6 3
của cạnh đó: 2 3 9
- Dựa vào đồ 2 5 12
thị ta liệt kê ra 2 6 7
T={(7,9)(1,6)(3,4)(5,7)(4,5)}, wT=19,
socanh=5<=8
T ∪ ET={(2,6)} ->
T={(7,9)(1,6)(3,4)(5,7),(4,5)(2,6)}
wT= 19+ w(2,6) = 19 + 7= 26
KẾT QUẢ CÁC BƯỚC LẶP
T={(7,9)(1,6)(3,4)(5,7)(4,5)(2,6)}, wT=26,
socanh=6<=8
T ∪ ET={(2,3)} -
>T={(7,9)(1,6)(3,4)(5,7),(4,5)(2,6)(2,3)}
wT= 26+ w(2,3) = 26 + 9= 35
T={(7,9)(1,6)(3,4)(5,7)(4,5)(2,6)(2,3)},
wT=35, socanh=7<=8
T ∪ ET={(7,8)} ->
T={(7,9)(1,6)(3,4)(5,7),(4,5)(2,6)(2,3)(7,8)}
wT= 35+ w(7,8) = 35 + 11= 46
socanh=8<9
•Đến đây, ta đã tìm được 8 cạnh. Vậy kết thúc thuật
toán. (Thỏa (*))
•Kết quả: Ta được đồ thị sau
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 + 7 +
9 + 4 + 6 + 5 + 1 + 11 = 46
Sử dụng thuật toán Kruskal tìm một cây bao trùm
nhỏ nhất của G, H? ghi ra kết quả từng bước chạy.
C
10
6 5 8
B 15 F
A D 6
6
8 8
12
4
G H
57
Prim(G: liên thông, có trọng số, v0; đỉnh bắt đầu)
begin ET := ;VT={v0};// VT là tập đỉnh của T, ET: tập
cạnh của T
while (|ET|<n-1)
begin
Tính T(VT) = {(i,j)E/ i VT j V – VT}
Chọn cạnh e=(u,v) trong T(VT) có trọng số bé nhất,
bổ sung e vào T (Nghĩa là:ET=ET {e}; VT = VT {v})
end
return T=<VT, ET>;
end
58
Khởi tạo
s là đỉnh được chọn trước
VT ={s} , ET = , wT = 0
Giải thuật
while VT V do {
M= { j kề của VT}
for jM {
◼ Tìm i VT sao cho i gần j nhất
◼ Gán nhãn cho đỉnh j : ((i,j) , w(i,j))
}endfor
Chọn đỉnh có nhãn (trọng số) nhỏ nhất có thể trong các đỉnh
được gán nhãn v, khi thêm vào VT không tạo ra chu trình: ((u,
v), w(u, v))
Khi đó cập nhật
◼ VT = VT +{v}
◼ ET = ET +{(u,v)}
◼ wT = wT + w(u,v)
}endwhile 58
❖ Các bước của thuật toán Prim(G: liên
thông, có trọng số, v0; đỉnh băt đầu)
• Bước 1: Chọn một cạnh bất kỳ có trọng số
nhỏ nhất từ đỉnh V0, đặt nó vào cây khung.
• Bước 2: Lần lượt ghép vào cây các cạnh
có trọng số nhỏ nhất liên thuộc với một
đỉnh của cây và không tạo ra chu trình
trong cây.
• Bước 3: Thuật toán dừng lại khi (n - 1)
cạnh được ghép vào cây
58
Ví dụ: Tìm cây bao trùm
nhỏ nhất của đồ thị bên
dưới bằng thuật toán Prim
bắt đầu tại đỉnh 1, ghi ra
kết quả từng bước chạy.
• Bước 1. Khởi tạo
o Ta tạo ra 2 tập hợp VT và ET, VT là tập hợp
các đỉnh và ET là tập hợp các cạnh tạo ra cây
khung nhỏ nhất.
o Ban đầu VT ={Ø} ET ={Ø}, wT = 0.
o Điều kiện dừng: VT = V
• Bước 2. Chọn 1 đỉnh bắt đầu từ cây
khung trên, ví dụ chúng ta chọn đỉnh theo
yêu cầu bài toán là đỉnh 1. Sau bước này,
ta có VT ={1}, VT V và ET ={Ø}, wT = 0.
KẾT QUẢ CÁC BƯỚC LẶP
VT ={1}, VT V và ET ={Ø}, wT = 0.
Xác định M = {2, 6}. Gán nhãn cho các
đỉnh trong M
2: ((1,2),8)
6: ((1,6),3) nhãn nhỏ nhất
Cập nhật:
VT = VT +{6} = {1,6}
ET = ET + {(1,6)}={(1,6)}
wT= 3
VT= {1,6}, VT V, ET ={(1,6)}, wT= 3
Xác định M = {2, 7}. Gán nhãn cho các
đỉnh trong M
2: ((1,2),8)
2: ((6,2),7) nhãn nhỏ nhất
7: ((6,7),10)
Cập nhật:
VT = VT +{2} = {1,6,2}
ET = ET + {(6,2)}={(1,6),(6,2)}
wT= 3+7=10
KẾT QUẢ CÁC BƯỚC LẶP
VT ={1,6,2}, VT V, ET ={(1,6),(6,2)}, wT=10
Xác định M = {3,5,7}. Gán nhãn cho các
đỉnh trong M
3: ((2,3),9) nhãn nhỏ nhất
5: ((2,5),12)
7: ((6,7),10)
Cập nhật:
VT = VT +{3} = {1,6,2,3}
ET = ET + {(2,3)}={(1,6),(6,2),(2,3)}
wT= 10 + 9 =19
VT = {1,6,2,3}, VT V,ET = {(1,6),(6,2),(2,3)}, wT= 19
Xác định M = {4,5,7}. Gán nhãn cho các
đỉnh trong M
4: ((3,4),4) nhãn nhỏ nhất
5: ((2,5),12) / 5: ((3,5),18)
7: ((6,7),10)
Cập nhật:
VT = VT +{4} = {1,6,2,3,4}
ET = ET + {(3,4)}={(1,6),(6,2),(2,3),(3,4)}
wT= 19+4=23
KẾT QUẢ CÁC BƯỚC LẶP
VT ={1,6,2,3,4}, VT V, ET={(1,6),(6,2),(2,3),(3,4)},
wT= 23
Xác định M = {5,7}. Gán nhãn cho các đỉnh trong M
5: ((3,5),18) // 5: ((2,5),12)
5: ((4,5),6) nhãn nhỏ nhất
7: ((6,7),10)
Cập nhật:
VT = VT +{5} = {1,6,2,3,4,5}
ET = ET + {(4,5)}={(1,6),(6,2),(2,3),(3,4),(4,5)}
wT= 23 +6=29
VT = {1,6,2,3,4,5}, VT V, ET =
{(1,6),(6,2),(2,3),(3,4),(4,5)}, wT= 29
Xác định M = {5,7}. Gán nhãn cho các đỉnh trong M
5: ((5,7),5) nhãn nhỏ nhất
7: ((6,7),10)
Cập nhật:
VT = VT +{7} = {1,6,2,3,4,5,7}
ET = ET + {(5,7)}={(1,6),(6,2),(2,3),(3,4),(4,5),(5,7)}
wT= 29 + 5 =34
KẾT QUẢ CÁC BƯỚC LẶP
VT ={1,6,2,3,4,5,7}, VT V, ET =
{(1,6),(6,2),(2,3),(3,4),(4,5),(5,7)}, wT=34
Xác định M = {8,9}. Gán nhãn cho các đỉnh trong M
8: ((7,8),11)
9: ((7,9),1) nhãn nhỏ nhất
Cập nhật:
VT = VT +{9} = {1,6,2,3,4,5,7,9}
ET = ET +{(7,9)}={(1,6),(6,2),(2,3),(3,4),(4,5),(5,7),(7,9)}
wT= 34 + 1=35
VT ={1,6,2,3,4,5,7,9}, VT V, ET =
{(1,6),(6,2),(2,3),(3,4),(4,5),(5,7),(7,9)}, wT=35
Xác định M = {9}. Gán nhãn cho các đỉnh trong M
8: ((7,8),11) nhãn nhỏ nhất
Cập nhật:
VT = VT +{8} = {1,6,2,3,4,5,7,9,8}
ET = ET
+{(7,8)}={(1,6),(6,2),(2,3),(3,4),(4,5),(5,7),(7,9),(7,8)}
wT= 35 + 11= 46
•Đến đây, ta đã tìm được VT ={1,6,2,3,4,5,7,9,8}, VT = V.
Vậy kết thúc thuật toán.
•Kết quả: Ta được đồ thị sau
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 + 7 +
9 + 4 + 6 + 5 +1+ 11 = 46
Sử dụng thuật toán Prim tìm một cây bao trùm
nhỏ nhất của G, H bắt đầu từ đỉnh A? ghi ra kết
quả từng bước chạy.
C
10
6 5 8
B 15 F
A D 6
6
8 8
12
4
G H
57
Cây khung có trọng lượng nhỏ nhất
Cho đồ thị như hình vẽ chạy minh họa từng bước tìm
cây khung có trọng số nhỏ nhất của 2 thuật toán sau:
1. Thuật toán Kruskal
2. Thuật toán Prim tại đỉnh 1.
Cây khung có trọng lượng nhỏ nhất
Cho đồ thị như ma trận có trọng số bên dưới, chạy
minh họa từng bước tìm cây khung có trọng số nhỏ
nhất của 2 thuật toán sau:
1. Thuật toán Kruskal
2. Thuật toán Prim tại đỉnh A.