You are on page 1of 28

Đề tài

Tìm đường đi ngắn nhất


Giáo viên hướng dẫn: Lê Kim Thư

Nhóm: Lần Cuối


Bài toán tìm đường đi ngắn nhất

 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ố

1. Đồ thị G = (V,E) gọi là đồ thị có trọng số (hay chiều dài,


trọng lượng) nếu mỗi cạnh(cung) e được gán với một số
thực w(e).Ta gọi w(e) là trọng lượng của e.
2. Độ dài của đường đi từ u đến v bằng tổng độ dài các cạnh
mà đường đi qua
3. Khoảng cách giữa 2 đỉnh u,v là độ dài ngắn nhất của các
đường đi từ u đến v.

52
Ma trận có trọng số

Cho G = (V, E), V = {v1,v2,…,v n} là đơn đồ thị có trọng số. Ma


trận khoảng cách của G là ma trận D= (dij) xác định như sau:

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

Các thuật toán tìm đường đi ngắn nhất

- 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

• Bước 1: Gán L(a) = 0, với mọi đỉnh x ≠ a gán L(x) = ∞. Kí


hiệu T = V.
• Bước 2: Chọn v T sao cho L(v) có giá trị nhỏ nhất,
đặt: T = T – {v}
• Bước 3: Nếu z T -> kết thúc
• Bước 4: Với mỗi x T kề với v, gán:
L(x) = min {L(x), L(v) + w(v, x)}
Nếu L(x) này thay đổi thì ghi nhớ đỉnh v cạnh x để sau
này xây dựng đường đi ngắn nhất.
Quay về bước 2
Ví dụ
Tìm đường đi ngắn nhất từ u đến các đỉnh
còn lại

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

• Bước 1: Với đỉnh xuất phát s. gọi d[v] là


khoảng cách từ s tới v với các giá trị khởi
tạo là: d[s] = 0
d[v] = + nếu v ≠ s
• Bước 2: Tối ưu hóa các d[v] như sau: Xét
mọi đỉnh u, v của đồ thị, nếu có một cặp
đỉnh u, v mà d[v] > d[u]+c[u,v] thì ta đặt lại
d[v]=d[u]+c[u,v]

Độ phức tạp của thuật toán O(n )


3
Ví dụ

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)

k = n = 6 . Lk(i) chưa ổn định nên đồ thị có mạch âm. Chẳng hạn:


4→2→6→4 có độ dài -3
Thuật toán Floyd

Bài toán: Cho đồ thị liên thông G=(V,E), có trọng số


w(i,j)>0 với mọi cung (i,j). Tìm đường đi ngắn nhất từ i
đến j
Thuật toán Floyd

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 )

You might also like