CÁC BÀI TOÁN ĐƯỜNG ĐI
ntsonptnk@gmail.com
NỘI DUNG
Đường đi ngắn nhất
Bài toán
Nguyên lý Bellman
Thuật toán Dijkstra
Thuật toán Floyd
Đồ thị Euler Đồ thị Hamilton
Thuật toán Ford-Bellman
ế ồ ị
ươ
ơ
ễ
Lý thuy t đ th , ch
ng 3 Nguy n Thanh S n
2
0
4
A
8
2
2
8
3
7
1
C
B
D
3
9
5
8
2
5
E
F
ĐƯỜNG ĐI NGẮN NHẤT
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
3
BÀI TOÁN
Cho đồ thị có hướng có trọng G=(X, E) và hai đỉnh s, t (cid:0) X, gọi P là một đường đi từ đỉnh s đến đỉnh t, trọng lượng (hay giá) của đường đi P được định nghĩa là:
L(P) = (cid:0)
(e(cid:0) P)L(e)
Bài toán: tìm đường đi từ s đến t có trọng lượng nhỏ nhất
ế ồ ị
ơ
ễ
Lý thuy t đ th Nguy n Thanh S n
4
NHẬN XÉT
Bài toán được phát biểu cho đồ thị có hướng có trọng, nhưng các thuật toán sẽ trình bày đều có thể áp dụng cho các đồ thị vô hướng có trọng bằng cách xem mỗi cạnh của đồ thị vô hướng như hai cạnh có cùng trọng lượng nối cùng một cặp đỉnh nhưng có chiều ngược nhau.
Khi tìm đường đi ngắn nhất có thể bỏ bớt đi các cạnh song song và chỉ chừa lại một cạnh có trọng lượng nhỏ nhất.
Đối với các khuyên có trọng lượng không âm thì cũng có thể bỏ đi mà không làm ảnh hưởng đến kết quả của bài toán. Đối với các khuyên có trọng lượng âm thì có thể đưa đến bài toán đường đi ngắn nhất không có lời giải.
ế ồ ị
ơ
ễ
Lý thuy t đ th Nguy n Thanh S n
5
ĐIỀU KIỆN TỒN TẠI LỜI GiẢI
P là một đường đi từ s đến t, giả sử P có chứa một mạch (cid:0)
0 thì có thể cải tiến đường đi P bằng cách
. Nếu L((cid:0) ) (cid:0) bỏ đi mạch (cid:0) Nếu L((cid:0) ) < 0 thì không tồn tại đường đi ngắn nhất từ đỉnh s đến đỉnh t vì nếu quay vòng tại (cid:0) càng nhiều vòng thì trọng lượng đường đi P càng nhỏ đi, tức là L(P)(cid:0)
.
-(cid:0) .
k
t s
(cid:0)
ế ồ ị
ơ
ễ
Lý thuy t đ th Nguy n Thanh S n
6
DỮ LIỆU NHẬP
Ma trận trọng lượng LNxN được định nghĩa:
Khi cài đặt thuật toán có thể dùng 0 thay cho (cid:0) bằng cách đưa thêm một số kiểm tra thích hợp.
12
nếu không có cạnh nối i đến j. Lij = trọng lượng cạnh nhỏ nhất nối i đến j nếu có, Lij = (cid:0)
0
12
7
(cid:0) (cid:0) (cid:0) B A (cid:0) (cid:0)
0
15
14
16
7
5
(cid:0) (cid:0) (cid:0)
15
14
0
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
5
0
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) D C
ế ồ ị
ơ
ễ
Lý thuy t đ th Nguy n Thanh S n
7
k
P2 P1 t s
’
P1
NGUYÊN LÝ BELLMAN
ế ồ ị
ơ
ễ
Lý thuy t đ th Nguy n Thanh S n
8
NGUYÊN LÝ BELLMAN
P. Giả sử P=P1
Gọi P là đường đi ngắn nhất từ đỉnh s đến đỉnh (cid:0) P2 với P1 là đường đi con t; k (cid:0) của P từ s đến k và P2 là đường đi con của P từ k đến t. Khi đó P1 cũng là đường đi ngắn nhất từ s đến k.
k
P2 P1 t s
’
P1
L(P1’) < L(P1) (cid:0)
L(P1’(cid:0) P2) < L(P1
(cid:0) P2)=L(P)
ế ồ ị
ơ
ễ
Lý thuy t đ th Nguy n Thanh S n
9
0
4
A
8
2
2
8
3
7
1
C
B
D
3
9
8
2
5
5 E
F
TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ CÓ TRỌNG SỐ DƯƠNG
THUẬT TOÁN DIJKSTRA
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
10
THUẬT TOÁN DIJKSTRA
Input: N, L, s, t – số đỉnh, ma trận trọng lượng, đỉnh xuất phát,
đỉnh kết thúc
Output: D, Labels – D[k]: trọng lượng ĐĐNN sk, Labels[k]:
đỉnh ngay trước k trong ĐĐNN sk
, (cid:0) k(cid:0) X\{s}; Labels[k]=-1, (cid:0) k(cid:0) X.
1. V=X; D[s]=0; D[k]=(cid:0) 2. Trong khi t(cid:0) V:
1. Chọn đỉnh v(cid:0) V với D[v] nhỏ nhất;
2. V := V\{v}; 3. Với mọi đỉnh k(cid:0) V và có cạnh nối từ v đến k,
Nếu D[k] > D[v]+Lvk thì
D[k] = D[v]+Lvk và Labels[k]=v
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
11
VÍ DỤ
(cid:0) 50
d(u) (cid:0)
10
(cid:0) 75
d(z) (cid:0)
u
z
s
(cid:0) 50
d(u) (cid:0)
10
(cid:0) 60
d(z) (cid:0)
u
z
s
Cập nhật độ dài ĐĐ từ s đến đỉnh z: 75 60
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
12
VÍ DỤ
2
9
8
4
Đồ thị G gồm 7 đỉnh, 12 cạnh như hình bên. Tìm đường đi ngắn nhất từ đỉnh 1 đến đỉnh 5
3
1
1
3
6
0
9
3
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
(cid:0) (cid:0)
4
0
8
6
8
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
5
2
0
5
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
4
1
0
8
4
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
5
(cid:0) (cid:0)
7
0
17
12
17
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
0
12
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
6
(cid:0) (cid:0)
2
4
0
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0)
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
13
VÍ DỤ
V: đỉnh chưa bị tô màu; D[k]: số có màu đỏ; Labels[k]: số có màu xanh lá (cid:0)
2
9
8
-1
4
(cid:0)
3
-1
1
1
3
0 -1
4
6
5
8
2
(cid:0) -1
4
(cid:0) (cid:0)
7
5
12
17
-1 -1
6
(cid:0) -1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
14
VÍ DỤ
V: đỉnh chưa bị tô màu; D[k]: số có màu đỏ; Labels[k]: số có màu xanh lá
2
9
8
9 1
4
(cid:0)
3
-1
1
1
3
0 -1
4
6
5
8
2
3 1
4
(cid:0)
7
5
12
17
-1 6 1
6
(cid:0) -1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
15
VÍ DỤ
V: đỉnh chưa bị tô màu; D[k]: số có màu đỏ; Labels[k]: số có màu xanh lá
2
9
8
4
7 4
3
4 4
1
1
3
0 -1
4
6
5
8
2
4
3 1
7
5
12
17
11 4 6 1
6
(cid:0) -1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
16
VÍ DỤ
V: đỉnh chưa bị tô màu; D[k]: số có màu đỏ; Labels[k]: số có màu xanh lá
2
9
8
4
7 4
3
4 4
1
1
3
0 -1
4
6
5
8
2
4
3 1
7
5
12
17
9 3 6 1
6
(cid:0) -1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
17
VÍ DỤ
V: đỉnh chưa bị tô màu; D[k]: số có màu đỏ; Labels[k]: số có màu xanh lá
2
9
8
4
7 4
3
4 4
1
1
3
0 -1
4
6
5
8
2
4
3 1
7
5
12
17
9 3 6 1
6
(cid:0) -1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
18
VÍ DỤ
ĐĐNN từ 1 đến 5 có trọng lượng D[5]=9: 5 3 4 1
2
9
8
4
7 4
3
4 4
1
1
3
0 -1
4
6
5
8
2
4
3 1
7
5
12
17
9 3 6 1
6
26 5
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
19
GIÁ TRỊ CÁC BIẾN D, Labels
D Labels
2 3 4 5 6 7 1 2 3 4 5 6 7
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) 1 0 (cid:0) 0 0 -1 -1 -1 -1 -1 -1 -1
(cid:0) 1 3 (cid:0) 6 1 1 -1 1 -1 -1 1
(cid:0) 2 9 (cid:0) 7 4 6 2 4 4 4 -1 1
3 4 3 -1 1
7 3 6
4 4 3 -1 7 4
5 3 -1 5 1 1 9 (cid:0) 9 (cid:0) 9 (cid:0)
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
20
VÍ DỤ
0
0
A
A
4
4
8
8
2
2
2
8
4
2
8
3
7
1
7
1
C
B
D
C
B
D
3
9
3
9
8
2
5
2
5
E
F
5 E
F
0
0
A
A
4
4
8
8
2
2
2
8
3
2
7
3
7
1
7
1
C
B
D
C
B
D
3
9
3
9
11
8
2
5
2
5
5 E
F
5 E
F
(cid:0) (cid:0)
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
21
VÍ DỤ
0
A
4
8
2
2
7
3
7
1
C
B
D
3
9
5
8
2
5
E
F
0
A
4
8
2
2
7
3
7
1
C
B
D
3
9
5
8
2
5
E
F
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
22
THUẬT TOÁN DIJKSTRA – CÀI ĐẶT
Graph Graph::Dijkstra(int s, int t) {
ườ ấ ừ //Tìm đ ắ ng đi ng n nh t t ế s đ n t
}
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
23
THUẬT TOÁN DIJKSTRA – CÀI ĐẶT
Graph Graph::PrintPath(int s, int t) {
ự ấ ừ ườ s đ n t d a vào Labels
int temp[MAX]; int dem = 0; ế ắ //In đ ng đi ng n nh t t while(Labels[t] != -1) {
temp[dem++]=t; t=Labels[t];
} temp[dem++]=s; while (dem > 0)
printf(“%d “, temp[--dem]);
}
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
24
TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH TRÊN ĐỒ THỊ
THUẬT TOÁN FLOYD
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
25
THUẬT TOÁN FLOYD
Input: N, L – số đỉnh, ma trận trọng lượng của G(X, E) Output: L, Nexts – L[u, v]: trọng lượng ĐĐNN uv,
Nexts[u, v]: đỉnh ngay sau u trong ĐĐNN uv
1. Nếu L[u, v](cid:0)
: Nexts[u, v]=v
(u, v)(cid:0) X2.
2. Với mọi t (cid:0)
(cid:0)
(cid:0)
Ngược lại: Nexts[u, v]=-1 , (cid:0) X Với mọi u (cid:0) Với mọi v (cid:0)
X có L[u, t](cid:0) X có L[t, v](cid:0)
Nếu L[u, v] > L[u, t] + L[t, v] thì
(cid:0)
1. L[u, v] = L[u, t] + L[t, v]
2. Nexts[u, v] = Nexts[u, t]
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
26
VÍ DỤ
Xác định đường đi ngắn nhất giữa các cặp đỉnh trên đồ thị gồm 4 đỉnh 6 cạnh
2
8
4
9
1
4
3
3
5
1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
27
VÍ DỤ
2
(cid:0)
4 2 (cid:0) (cid:0) 9
-1 -1 8 3 -1 2
4
1 3
(cid:0) (cid:0) 34 -1 -1 (cid:0)
1
3
-1 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
28
VÍ DỤ
t = 1 u = 3 v = 2
2
(cid:0)
4 2 (cid:0) (cid:0) 9
-1 -1 8 3 14 1 -1 2
4
1 3
(cid:0) (cid:0) 34 -1 -1 (cid:0)
1
3
-1 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
29
VÍ DỤ
t = 1 u = 3 v = 4
2
(cid:0)
4 2 (cid:0) 9
-1 -1 8 3 14 1 2
4
(cid:0) (cid:0) 34 -1 1 3 8 1 -1 (cid:0)
1
3
-1 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
30
VÍ DỤ
t = 2 u = 1 v = 3
2
(cid:0)
4 2 (cid:0) 9
-1 -1 8 3 14 1 2
4
(cid:0)
34 -1 1 3 8 1 (cid:0)
1
3
-1 17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
31
VÍ DỤ
t = 2 u = 3 v = x
2
(cid:0)
4 2 (cid:0) 9
-1 -1 8 3 14 1 2
4
(cid:0)
34 -1 1 3 8 1
1
3
17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
32
VÍ DỤ
t = 2 u = 4 v = 3
2
(cid:0)
4 2 (cid:0) 9
-1 -1 8 3 14 1 2
4
(cid:0)
34 -1 1 3 8 1
1
3
17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
33
VÍ DỤ
t = 3 u = 1 v = 2
2
(cid:0)
4 2 (cid:0) 9
-1 -1 8 3 14 1 2
4
(cid:0)
34 -1 1 3 8 1
1
3
17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
34
VÍ DỤ
t = 3 u = 1 v = 4
2
(cid:0)
4 2 (cid:0) 9
-1 -1 8 3 14 1 2
4
(cid:0)
34 -1 1 3 8 1
1
3
17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
35
VÍ DỤ
t = 3 u = 2 v = 1, 4
2
4 2 13 9 16 3
3 8 3 14 1 2
4
(cid:0)
34 -1 1 3 8 1
1
3
17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
36
VÍ DỤ
t = 3 u = 4 v = 1, 2
2
4 2 13 9 16 3
3 8 3 14 1 2
4
34 63 1 3 8 1
1
3
17 2 5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
37
VÍ DỤ
t = 4 u = 1 v = 2, 3
2
4 2 13 7 16 3
3 8 3 14 1 4
4
34 63 1 3 8 1
4 4
1
3
5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
38
VÍ DỤ
t = 4 u = 2 v = 1, 3
2
4 2 13 7 16 3
3 8 3 14 1 4
4
34 63 1 3 8 1
4 4
1
3
5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
39
VÍ DỤ
t = 4 u = 3 v = 1, 2
2
4 2 13 7 16 3
3 8 3 12 1 4
4
34 63 1 3 8 1
4 4
1
3
5 1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
40
k
t s
TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ CÓ CẠNH ÂM
(cid:0)
THUẬT TOÁN BELLMAN
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
41
THUẬT TOÁN BELLMAN Input: N, L, u – số đỉnh, ma trận trọng lượng của G(X, E),
đỉnh xuất phát
Output: (cid:0)
(cid:0) , Labels – (cid:0) (k, v): trọng lượng ĐĐNN uv sau k bước lặp, Labels[v]: đỉnh ngay trước v trong ĐĐNN uv
(cid:0) v(cid:0) X\{u}; Labels[v] = -1 (cid:0) v(cid:0) X;
1. (cid:0) (0, u)=0; (cid:0) (0, v)=(cid:0) 2. Lặp với k = 1, 2, N-1
1.(cid:0) j(cid:0)
i(cid:0) X, chọn j(cid:0) X sao cho (cid:0) (k-1, j)+Lji đạt nhỏ nhất; nếu i: 1.(cid:0) (k, i)= (cid:0) (k-1, j)+Lji 2.Labels[i] = j
2.Nếu (cid:0) (k) = (cid:0) (k-1): (cid:0) (k, v) là đường đi ngắn nhất u v vẫn còn thay đổi sau bước lặp N-1: từ u đã đi đến 3. Nếu (cid:0)
mạch âm
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
42
VÍ DỤ
1
1
2
2
8
2
Tìm đường đi ngắn nhất từ đỉnh 3 đến các đỉnh còn lại
5
3
4
4
1
1
2
6
5
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
43
VÍ DỤ
1
k = 0
(cid:0) (cid:0)
-1
1
2
2
8
2
-1
5
(cid:0)
3
0 -1 -1
4
4
1
1
2
(cid:0) (cid:0)
6
-1
5
-1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
44
VÍ DỤ
1
k = 1
(cid:0) (cid:0)
-1
1
2
2
8
2
-1
5
(cid:0)
3
0 -1 5 3 -1
4
4
1
1
2
(cid:0) (cid:0)
6
4 3 -1
5
-1 3 -1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
45
VÍ DỤ
1
k = 2
(cid:0) (cid:0)
-1
1
2
2
8
2
5
-1
3
0 -1
4
4
1
1
2
5 3
6
4 1 5 3
5
-1 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
46
VÍ DỤ
1
k = 3
(cid:0) (cid:0)
-1
1
2
2
8
2
5
-1
3
0 -1
4
4
1
1
2
5 2 3 6
6
1 5
5
-1 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
47
VÍ DỤ
1
k = 4
(cid:0) (cid:0)
-1
1
2
-1
DỪNG
2
8
2
5
3
0 -1
4
4
1
1
2
2 6
6
1 5
5
-1 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
48
GIÁ TRỊ CÁC BIẾN (cid:0)
, Labels
(cid:0) Labels
k/v 1 2 k/v 1 2 3 3 4 5 6 4 5 6
(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) 0 -1 -1 -1 -1 -1 -1 0 0
(cid:0) (cid:0) 0 5 -1 4 1 -1 -1 -1 3 3 3 1
(cid:0) (cid:0) 0 5 -1 1 2 -1 -1 -1 3 3 5 2
(cid:0) (cid:0) 0 2 -1 1 3 -1 -1 -1 6 3 5 3
(cid:0) (cid:0) 0 2 -1 1 4 -1 -1 -1 6 3 5 4
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
49
VÍ DỤ
1
1
2
2
8
2
Tìm đường đi ngắn nhất từ đỉnh 1 đến các đỉnh còn lại
5
3
4
4
1
1
2
6
5
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
50
VÍ DỤ
1
k = 0
(cid:0)
-1
1
2
2
8
2
0 -1
5
(cid:0) (cid:0)
3
-1 -1
4
4
1
1
2
(cid:0) (cid:0)
6
-1
5
-1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
51
VÍ DỤ
1
k = 1
1 1
1
2
2
8
2
0 -1
5
(cid:0)
3
2 1 -1
4
4
1
1
2
(cid:0) (cid:0)
6
-1
5
-1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
52
VÍ DỤ
1
k = 2
1 1
1
2
2
8
2
5
-1 2
3
2 1 7 3
4
4
1
1
2
6
6 3
5
1 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
53
VÍ DỤ
1
k = 3
0 1
1
2
2
8
2
5
-1 2
3
1 1 7 3
4
4
1
1
2
6
3 5
5
1 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
54
VÍ DỤ
1
k = 4
0 1
1
2
2
8
2
5
-2 2
3
1 1 6 3
4
4
1
1
2
6
3 5
5
0 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
55
VÍ DỤ
1
k = 5
-1 1
1
2
2
8
2
-2 2
DỪNG – CÓ MẠCH ÂM
5
3
0 1 4 6
4
4
1
1
2
6
2 5
5
0 3
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
56
Leonhard Euler (1707 – 1783)
Konigsberg, Hmmm
ĐỒ THỊ EULER
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
57
BÀI TOÁN 7 CHIẾC CẦU
Thành phố Konigsberg (Đức) bị chia thành 4 vùng do 2 nhánh của 1 dòng sông. Có 7 chiếc cầu nối những vùng nầy với nhau. Bài toán: xuất phát từ một vùng đi dạo qua mỗi chiếc cầu đúng một lần và trở về nơi xuất phát. Năm 1736, nhà toán học Euler đã mô hình bài toán nầy bằng một đồ thị vô hướng với mỗi đỉnh ứng với một vùng, mỗi cạnh ứng với một chiếc cầu
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
58
BÀI TOÁN 7 CHIẾC CẦU
A
C
D
B
A
C D
B
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
59
ĐỊNH NGHĨA
DÂY CHUYỀN EULER: dây chuyền đi qua tất cả các
cạnh trong đồ thị, mỗi cạnh đúng một lần.
CHU TRÌNH EULER: dây chuyền Euler có đỉnh đầu
trùng với đỉnh cuối.
ĐƯỜNG ĐI EULER: đường đi qua tất cả các cạnh của
đồ thị, mỗi cạnh đúng một lần.
MẠCH EULER: đường đi Euler có đỉnh đầu trùng với
đỉnh cuối.
ĐỒ THỊ EULER VÔ HƯỚNG: đồ thị vô hướng có chứa
một chu trình Euler.
ĐỒ THỊ EULER CÓ HƯỚNG: đồ thị có hướng có chứa
một mạch Euler.
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
60
ĐỊNH LÝ EULER
Đồ thị vô hướng G=(X, E) 1. G là đồ thị Euler (cid:0)
G liên thông và d(x) chẵn
(cid:0) x(cid:0) X.
2. G có chứa dây chuyền Euler và không chứa G liên thông có
chu trình chu trình Euler (cid:0) chứa đúng hai đỉnh bậc lẻ.
G liên thông và d+(x)=d-(x)
Đồ thị có hướng G=(X, E) 1. G là đồ thị Euler (cid:0) X.
(cid:0) x (cid:0)
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
61
VÍ DỤ a
e e
a c a d d b
b c b
có đường đi Euler: bacbd
d (G2) (G1) c (G3)
Liên thông và có 2 đỉnh bậc lẻ có dây chuyền Euler: bacdaedbc
Liên thông và các đỉnh đều có bậc chẵn có chu trình Euler: bacdaedbcb
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
62
GIẢI THUẬT FLEURY
Cạnh e của đồ thị G được gọi là CẦU nếu xóa e khỏi đồ thị thì làm tăng số thành phần liên thông của G.
Giải thuật Gọi chu trình cần tìm là C 1. Khởi tạo: Chọn một đỉnh bất kỳ cho vào C. 2. Lặp trong khi G vẫn còn cạnh
1. Chọn cạnh e nối đỉnh vừa chọn với một đỉnh kề với nó theo nguyên tắc: chỉ chọn cầu nếu không còn cạnh nào khác để chọn.
2. Bổ sung e và đỉnh cuối của nó vào C.
3. Xóa e khỏi G.
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
63
VÍ DỤ
1 2 3 4 5 3 1
2
4
3
1
5
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
64
GiẢI THUẬT XÁC ĐỊNH CÁC CHU TRÌNH THÀNH PHẦN
Input: đồ thị Euler G(X, E) Output: chu trình Euler C của G 1. Chọn đỉnh v (cid:0) X; C = {v} 2. Lặp trong khi G còn cạnh
1. Chọn đỉnh v (cid:0) C còn cạnh trong G
2. Tìm chu trình C’ xuất phát từ v.
3. Ghép C’ vào C
4. Loại bỏ các cạnh của C’ khỏi G
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
65
VÍ DỤ
1
1 3 2 4 3 5 3
2
4
3
1
5
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
66
Sir William Rowan Hamilton (18051865)
ĐỒ THỊ HAMILTON
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
67
BÀI TOÁN KHỞI ĐIỂM
“Xuất phát từ một đỉnh của khối thập nhị diện đều, hãy đi dọc theo các cạnh của khối đó sao cho đi qua tất cả các đỉnh khác, mỗi đỉnh qua đúng một lần, sau đó trở về đỉnh xuất phát”.
Bài toán nầy được nhà toán học Hamilton đưa ra vào năm 1859
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
68
ĐỊNH NGHĨA
Đồ thị vô hướng G(X, E) DÂY CHUYỀN HAMILTON: dây chuyền đi qua tất cả các đỉnh của đồ thị mỗi đỉnh đúng một lần. CHU TRÌNH HAMILTON: dây chuyền Hamilton và một cạnh trong đồ thị nối đỉnh đầu của dây chuyền với đỉnh cuối của nó.
ĐỒ THỊ HAMILTON: đồ thị có chứa một chu
trình Hamilton.
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
69
MỘT SỐ KẾT QUẢ
Đồ thị đủ luôn là đồ thị Hamilton. Với n lẻ (cid:0)
3 thì Kn có (n-1)/2 chu trình Hamilton đôi một không có cạnh chung.
Đồ thị lưỡng phân G với hai tập đỉnh X1, X2 và (cid:0) X1(cid:0) =(cid:0) X2(cid:0) =n. Nếu d(x)(cid:0) n/2 (cid:0) x của G thì G là đồ thị Hamilton.
Đồ thị vô hướng đơn G gồm n đỉnh và m cạnh.
Nếu m(cid:0)
(n2-3n+6)/2 thì G là đồ thị Hamilton.
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
70
Đồ thị vô hướng đơn G gồm n đỉnh với n(cid:0) 3 Nếu d(x)(cid:0) n/2 (cid:0) x của G thì G là đồ thị Hamilton. Nếu d(x)(cid:0) Hamilton. Nếu d(x)+d(y)(cid:0) n với mọi cặp đỉnh x, y không kề nhau của G thì G là đồ thị Hamilton.
(n-1)/2 (cid:0) x của G thì G có dây chuyền
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
71
QUI TẮC XÁC ĐỊNH
1. Nếu G có đỉnh bậc < 2 thì G không có chu trình
Hamilton
2. Nếu đỉnh có bậc 2 thì 2 cạnh kề với nó phải
nằm trong chu trình Hamilton
3. Các cạnh thừa (ngoài 2 cạnh đã chọn trong chu trình Hamilton) phải được bỏ đi trong quá trình xác định chu trình
4. Nếu quá trình xây dựng tạo nên một chu trình
con thì đồ thị không có chu trình Hamilton
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
72
VÍ DỤ
4 2
3
5
1
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
73
BÀI TẬP
1. Chứng minh nguyên lý Bellman 2. Chứng minh tính đúng đắn của các thuật toán
Dijkstra, Floyd, Bellman
3. Cài đặt thuật toán xác định chu trình Euler 4. Xác định các “nét” của Đồ thị K nét.
ế ồ ị
ươ
ơ
Lý thuy t đ th ch
ễ ng 3 Nguy n Thanh S n
74