Professional Documents
Culture Documents
Cho G = <V, E>. Mỗi cạnh của đồ thị được gán với
một số thực gọi là trọng số.
Bài toán: s và t là 2 đỉnh của đồ thị G . Hãy tìm
đường đi có tổng trọng số nhỏ nhất từ s đến t.
B
5
5
A 15 G 3
22 3
11
7 C
E F
16 17
9
Đường đi ngắn nhất từ A đến D?
Đồ thị có trọng số
52
Ma trận có trọng số
0 khi I = j
dij = W(vivj) khi vivj thuộc E
∞ khi vivj không thuộc E
53
Bài toán đường đi ngắn nhất
54
70
v2 73 v5
5 10
26 27 49
9
23
v1 31 v3 v7
38
D=
40 8 25
12
v4 16 v6
Bài toán đường đi ngắn nhất
54
- Vét cạn
- Dijkstra
- Ford – Bellman
- Floyd
Thuật toán Dijkstra
Bài toán.
Cho G = (V, E) đơn, liên thông, có trọng số dương (w(uv) > 0
với mọi u khác v). Tìm đường đi ngắn nhất từ u0 đến v và tính
khoảng cách d(u 0,v).
56
Thuật toán Dijkstra
Phương pháp
Xác định tuần tự các đỉnh có khoảng cách đến u0 từ nhỏ đến
lớn.
1. Trước tiên đỉnh có khoảng cách nhỏ nhất đến u0 là u 1
2. Trong V\{u 0 } tìm đỉnh có khoảng cách đến u 0 nhỏ nhất (là một trong
những đỉnh kề với u 0 ) giả sử đó là u 1
3. Trong V\{u 0 ,u 1} tìm đỉnh có khoảng cách đến u 0 nhỏ nhất (đỉnh
này phải là một trong các đỉnh kề với u 0 hoặc u1 ) giả sử đó là u2
4. Tiếp tục như trên cho đến bao giờ tìm được khoảng cách từ u0
đến mọi đỉnh .
Nếu G có n đỉnh thì:
57
0 = d(u0,u0) < d(u0,u1) ≤ d(u0,u2) <…< d(u0,un-1)
Thuật toán Dijkstra
7
r s
1
4
3 3
u x
2 t 1
3
4
y 3 z 5 w
60
Ví dụ
7
r s
1
4
3 3
u x
2 t 1
3
4
y 3 z 5 w
u r s t x y z w
0* (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
61
Ví dụ
7
r s
1
4
3 3
u x
2 t 1
3
4
y 3 z 5 w
u0 r s t x y z w
0* (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
- (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
62
Ví dụ
7
r s
1
4
3 3
u x
2 t 1
3
4
y 3 z 5 w
u0 r s t x y z w
0* (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
- (4,u0) (∞,-) (∞,-) (∞,-) (1u0)* (∞,-) (∞,-)
- (3,y)* (∞,-) (∞,-) (∞,-) - (4,y) (∞,-)
63
Ví dụ r 7
u0 r s t x y z w
0* (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
- (4,u0) (∞,-) (∞,-) (∞,-) (1u0)* (∞,-) (∞,-)
- (3,y)* (∞,-) (∞,-) (∞,-) - (4,y) (∞,-)
- - (10,r) (6,r) (∞,-) - (4,y)* (∞,-)
- - (10,r) (6,r)* ,-) - - (9,z)
- - (9,t) - (7,t)* - - (9,z)
- - (8,x)* - - - - (9,z)
- - - -
64
- - - (9,z)*
Ví dụ
Cây đường đi
r s
1
u 3 t 1 x
2
y 3 z 5 w
65
Thuật toán Ford-Bellman
Bài toán:
Cho đồ thị có hướng G=(V,E) (có trọng số
có thể âm), với n đỉnh s V là đỉnh xuất phát.
Tìm đường đi ngắn nhất tới các đỉnh còn lại.
Phương pháp
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
Ví dụ
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
76
Ví dụ
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
1 0 (7,1) (∞,-) (8,1) (∞,-) (∞,-)
77
Ví dụ
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
1 0 (7,1) (∞,-) (8,1) (∞,-) (∞,-)
2 0 (7,1) (11,2) (8,1) (9,2) (8,2)
78
Ví dụ
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
1 0 (7,1) (∞,-) (8,1) (∞,-) (∞,-)
2 0 (7,1) (11,2) (8,1) (9,2) (8,2)
3 0 (7,1) (10,6) (2,6) (9,2) (8,2)
79
Ví dụ
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
1 0 (7,1) (∞,-) (8,1) (∞,-) (∞,-)
2 0 (7,1) (11,2) (8,1) (9,2) (8,2)
3 0 (7,1) (10,6) (2,6) (9,2) (8,2)
4 0 (4,4) (10,6) (2,6)
80
(4,4) (8,2)
Ví dụ
4
2 3
2
7 1
1 2 2 6
-6
3
4 2 5
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
1 0 (7,1) (∞,-) (8,1) (∞,-) (∞,-)
2 0 (7,1) (11,2) (8,1) (9,2) (8,2)
3 0 (7,1) (10,6) (2,6) (9,2) (8,2)
4 0 (4,4) (10,6) (2,6) (4,4) (8,2)
5 0 (4,4) (8,2) (2,6) (4,4) (5,2)
Ví dụ
k 1 2 3 4 5 6
0 0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
1 0 (7,1) (∞,-) (8,1) (∞,-) (∞,-)
2 0 (7,1) (11,2) (8,1) (9,2) (8,2)
3 0 (7,1) (10,6) (2,6) (9,2) (8,2)
4 0 (4,4) (10,6) (2,6) (4,4) (8,2)
5 0 (4,4) (8,2) (2,6) (4,4) (5,2)
6 0 (4,4) (7,6) (-1,6) (4,4) (5,2)
Phương pháp:
• Bước 1: Ký hiệu D0=[d0(i,j)] là ma trận xuất phát
• Bước 2: k=0
Nếu k = n thì kết thúc, Dn là ma trận độ dài
đường đi ngắn nhất. Ngược lại k=k+1.
• Bước 3: Tính ma trận Dk theo Dk-1
Nếu dk-1(i,j)>dk-1(i,k)+dk-1(k,j) thì đặt:
dk(i,j)=dk-1(i,k)+dk-1(k,j)
Ngược lại Nếu dk(i,j)=dk-1(i,j)
Quay lại bước 2.
Thuật toán Floyd
Chương trình:
For (k=1; k>=n; k++)
for(u=1; u<=n; u++)
for(v=1; v<=n; v++)
c[u,v]=min(c[u,v], c(u,k] + c[k,u]);
Độ phức tạp của thuật toán là O(n3 )