Tải bản đầy đủ (.docx) (38 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (685.45 KB, 38 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM
KHOA TIN
-----



-----

NGUYỄN TIẾN DUY

BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT VÀ
ỨNG DỤNG

KHÓA LUẬN TỐT NGHIỆP


LỜI CẢM ƠN
Trước tiên em xin chân thành cảm ơn toàn bộ giảng viên khoa Tin đã
nhiệt tình dạy bảo và truyền đạt những kiến thức, kinh nghiệm cho em trong bốn
năm học tại trường.
Để có được thành quả ngày hôm nay em xin chân thành cảm ơn sâu sắc
nhất đến thầy Trần Quốc Chiến đã luôn tận tình hướng dẫn, giúp đỡ và động
viên em trong suốt quá trình thực hiện đề tài.
Em cũng xin cảm ơn gia đình, bạn bè đã luôn quan tâm, giúp đỡ về tinh
thần cũng như các phương tiện vật chất góp phần quý báu để hoàn thành đề tài
này.
Một lần nữa em xin gửi đến các Thầy Cô, Gia Đình và Bạn bè lòng biết
ơn chân thành và sâu săc.
Trong quá trình nghiên cứu đề tài dù đã có nhiều cố gắng nhưng không
tránh khỏi những thiếu sót, em rất mong nhận được sự thông cảm và chỉ dẫn


thêm của thầy cô, cùng các bạn.
Em xin chân thành cảm ơn!
Đà Nẵng, tháng 05 năm 2012
Sinh viên
Nguyễn Tiến Duy


ĐẶT VẤN ĐỀ
Ngày nay, sự phát triển của ngành công nghệ thông tin đã góp phần quan trọng
trong sự phát triển của xã hội, nó đã thâm nhập vào mọi đời sống xã hội và có nhiều
ứng dụng rộng rãi trong nhiều lĩnh vực khác nhau như: kĩ thuật, kinh tế, giáo dục, du
lịch .v.v
Lý thuyết đồ thị là một ngành khoa học đã có từ lâu nhưng lại có nhiều ứng
dụng hiện đại. Đồ thị là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó,
nó tỏ ra là công cụ hữu hiệu để mô hình hóa và giải quyết các bài toán trong nhiều lĩnh
vực: khoa học, kĩ thuật, kinh tế, xã hội .v.v
Trên cơ sở những kiến thức đã học được trong môn Lý thuyết đồ thị và sự
hướng dẫn nhiệt tình của thầy Trần Quốc Chiến, tôi đã đi sâu tìm hiểu về các thuật
toán tìm đường đi ngắn nhất trong đồ thị và thấy được tính hữu ích của chúng. Do đó,
tôi đã chọn đề tài nghiên cứu “ Bài toán tìm đường đi ngắn nhất và ứng dụng”.
Tuy nhiên, vì thời gian không cho phép và trình độ có hạn nên tôi chỉ đi vào
nghiên cứu tìm hiểu thuật toán và minh họa cơ bản trên nền web.


CHƯƠNG I: TỔNG QUAN VỀ LÝ THUYẾT ĐỒ THỊ
1.1. Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh
này.Chúng ta phân biệt các loại đồ thị khác nhau bởi kiểu và số lượng cạnh nối hai
đỉnh nào đó của đồ thị . Để có thể hình dung được tại sao lại cần đến
các loại đồ thị khác nhau ,chúng ta sẽ nêu ví dụ sử dụng chúng để mô tả một mạng

máy tính .Giả sử ta có một mạng gồm các máy tính và các kênh điện thoại(gọi tắt là
tên thoại) nối các máy tính này.Chúng ta có thể biểu diễn các vị trí đặt máy tính bởi
các điểm và các kênh thoại nối chúng bởi các đoạn nối,xem hình 1
Đồng Nai

Hà Tây

Huế

TPHCM

Hà Nội
Quãng Ngãi
Phú Yên

An Giang
Bình Định

Khánh Hòa

Hình 1.1. Sơ đồ mạng máy tính
Nhận thấy rằng trong mạng hình 1.1, giữa hai máy tính bất kỳ chỉ cho phép nhiều nhất
là một kênh thoại nối chúng,kênh thoại này cho phép liên lạc cả hai chiều và không có
máy tính nào lại được nối với chính nó.Sơ đồ mạng máy tính cho tronh hình 1 được
gọi là đơn đồ thị vô hướng => ta đi đến định nghĩa sau:
Định nghĩa 1. Đơn đồ thị vô hướng G=(V,E) bao gồm V là tập đỉnh,và E là tập các
cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh.
Trong trường hợp giữa hai máy tính nào đó thường xuyên phải truyền tải nhiều thông
tin người ta phải nối hai máy này bởi nhiều kênh thoại . Mạng với đa kênh thoại giữa
các máy tính được cho trong hình 1.2.

Hà Tây

Hà Nội

Đồng Nai

Huế

HCM

An Giang

Bình Định

Quãng Ngãi
Phú Yên Khánh Hòa Hình 1.2.
Sơ đồ mạng máy tính với đa kênh thoại
Trang 1


Định nghĩa 2. Đa đồ thị vô hướng G=(V,E) bao gồm V là tập các đỉnh , và E là họ các
cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh .Hai cạnh e 1 va
e2 được gọi là cạnh lặpnếu chúng cùng tương ứng với một cặp đỉnh.
Hà Tây

Đồng Nai

Hà Nội

Quãng Ngãi


TPHCM

Huế

An Giang

Bình Định

Phú Yên

Khánh Hòa
Hình 1.3. Sơ đồ mạng máy tính với kênh thông báo.
Rõ ràng mỗi đơn đồ thị đều là đa đồ thị, nhưng không phải đa đồ thị nào cũng
là đơn đồ thị, vì trong đa đồ thị có hai hay nhiều hơn cạnh nối một cặp đỉnh nào đó.
Trong mạng máy tính có thể có những kênh thoại nối một máy tính nào đó với chính
nó(chẳng hạn với mục đích thông báo).Mạng như vậy được cho trong hình 1.3.Như
vậy đa đồ thị không thể mô tả được mạng như vậy, bởi vì có những khuyên (cạnh nối
một đỉnh vói chính nó).Trong trường hợp này chúng ta cần sử dụng đến khái niệm giả
đồ thị vô hướng, được định nghĩa như sau:
Ta đi đến định nghĩa sau:
Định nghĩa 3. Đơn đồ thị có hướng G=(V,E)bao gồm V là tập các đỉnh, và E là tập
các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung.
Nếu trong mạng có thể có đa kênh thoại một chiều,ta sẽ phải sử dụng đến khái niệm
đa đồ thị có hướng:
Định nghĩa 4. Đa đồ thị có hướngG=(V,E) bao gồm V là tập các đỉnh,và E là họ các
cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung.Hai cung e 1 va e2
tương ứng với cùng một cặp đỉnh được gọi là cung lặp.
Trong các phần tiếp theo chủ yếu chúng ta sẽ làm việc với đơn đồ thị vô hướng và đơn
đồ thị có hướng.Vì vậy, để cho ngắn gọn , ta sẽ bỏ qua tính từ đơn mỗi khi nhắc đến

chúng.
1.2. Các thuật ngữ cơ bản
Trong mục này chúng ta sẽ trình bày một số thuật ngữ cơ bản của lý thuyết đồ
thị.Trước tiên ,ta xét các thuật ngữ mô tả các đỉnh và cạnh của đồ thị vô hướng.
Định nghĩa 1. Hai đỉnh u va v của đồ thị có hướng G được gọi là kề nhau nếu (u,v) là
cạnh của đồ thị G.Nếu e=(u,v) là cạnh của đồ thị thì ta nói cạnh này là cạnh liên
Trang 2


thuộc với hai đỉnh u và v, hoặc cũng nói là cạnh e nối đỉnh u và đỉnh v, đồng thời các
đỉnh u và v sẽ được gọi là các đỉnh đầu của cạnh (u,v).
Để có thể biết có bao nhiêu cạnh liên thuộc với một đỉnh , ta đưa vào định nghĩa sau :
Định nghĩa 2. Ta gọi bậc của đỉnh v trong đồ thị vô hướnglà số cạnh liên thuộc với
nó ta sẽ kí hiệu là deg(v).
b
c
d

a

f

e

g

Hình 1.4. Đồ thị vô hướng
Thí dụ . Xét đồ thị cho trong hình 1.4, ta có
deg(a)=1, deg(b)=4 , deg(c)=4 , deg(f)=3,
deg(d)=1 , deg(e)=3 , deg(g)=0.

Đỉnh bậc 0 gọi là đỉnh cô lập , đỉnh bậc 1 được gọi là đỉnh treo .Trong ví dụ trên đỉnh
g là đỉnh cô lập, a và d là các đỉnh treo. Bậc của đỉnh có tính chất sau :
Định lý 1. Giả sử G=(V,E) là đồ thị vô hướng với m cạnh . Khi
đó 2m=∑ deg(v)
v∈V
Chứng minh. Rõ ràng trong mỗi cạnh e=(u,v) được tính một lần trong deg(u) và một
lần trong deg(v). Từ đó suy ra tổng tất cả các bậc của các đỉnh bằng hai lần số cạnh
Thí dụ 2. Đồ thị với n đỉnh và mỗi đỉnh có bậc là 6 có bao nhiêu cạnh ?
Giải: Theo định lý 1,ta có 2m=6n.Từ đó suy ra số cạnh của đồ thị là 3n.
Hệ quả. Trong đồ thị vô hướng,số đỉnh bậc lẻ(nghĩa là có bậc là số lẻ) là một số chẵn.
Chứng minh. Thực vậy, gọi O và U tương ứng là tập đỉnh bậc lẻ và tập đỉnh bậc chẵn
của đồ thị,ta có
2m=∑deg(v)= ∑deg(v)+ ∑deg(v)
v∈V
v∈O
v∈U
Do deg(v) là chẵnvới v là đỉnh trong U nên tổng thứ hai trong vế phải ở trên là số
chẵn.Từ đó suy ra tổng thứ nhất(chính là tổng bậc của các đỉnh bậc lẻ) cũng phải là số
chẵn, do tất cả các số hạng của nó là số lẻ, nên tổng này phải gồm một số chẵn các số
hạng.Vì vậy , số đỉnh bậclẻ phải là số chẵn.
Ta xét các thuật ngữ tương tự cho đồ thị có hướng.

Trang 3


Định nghĩa 3.Nếu e=(u,v) là cung của đồ thị có hướng G thì ta nói hai đỉnh u và vlà
kề nhau,và nói cung(u,v) nối đỉnh u với đỉnh v hoặc cũng nói cung này là đi ra khỏi
đỉnh u và đi vào đỉnh v. Đinh u (v) sẽ được gọi là đỉnh đầu (cuối) của cung (u,v).
Tương tự như khái niệm bậc, đối với đồ thị có hướng ta có khái niệm bán bậc ra(vào)
của một đỉnh.

Định nghĩa 4.Ta gọi bán bậc ra (vào) của đỉnh v trong đồ thị có hướng là số
+
cung của đồ thị đi ra khỏi nó (đi vào nó) và kí hiệu la deg (v)(deg (v)).
a

b

c

e
d
Hình 1.5. Đồ thị có hướng G
Thí dụ 3. Xét đồ thị cho trong hình 1.5. Ta có
-

-

-

-

-

deg (a)=1, deg (b)=2, deg (c)=2, deg (d)=2, deg (e)=2.
+
+
+
+
+
deg (a)=3, deg (b)=1 deg (c)=1, deg (d)=2, deg (e)=2


Do mỗi cung (u,v) sẽ được tính một lần trong bán bậc vào của đỉnh v và một
lần trong bán bậc ra của đỉnh u nên ta có
Định lý 2. Giả sử G=(V,E) là đò thị có hướng , khi đó
+
∑deg (v)= ∑deg (v)=|E|
v∈ V

v∈V

Rất nhiều tính chất của đồ thị có hướng không phụ thuộc vào hướng trên các cung của
nó. Vì vậy, trong nhiều trường hợp sẽ thuận tiện hơn nếu ta bỏ qua hướng trên các
cung của đồ thị. Đồ thị vô hướng thu được bằng cách bỏ qua hướng trên các cung
được gọi là đồ thị vô hướng tương ứng với đồ thị có hướng đã cho.
1.3. Định nghĩa đường đi, chu trình , đồ thị liên thông.
Định nghĩa 1. Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên
dương, trên đồ thị vô hướng G=(V,E) là dãy xo, x1 , ... , xn-1 , xn
trong đó u=x0 , v=xn , ( xi , xi+1 ) ∈E , i= 0, 1, 2 ,..., n-1.
Đường đi nói trên còn có thể biểu diễn dưới dạng các cạnh:
(x0 , x1 ) , ( x1 , x2), ... , ( xn-1 , xn ).
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh
đầu trùng với đỉnh cuối ( tức là u=v) được gọi là chu trình. Đường đi hay chu trình
được gọi là đơn nếu như không có cạnh nào bị lặp lại.

Trang 4


Thí dụ 1. Trên đồ thị vô hướng cho trong hình 1.6: a,d,c,f,e là đường đi đơn độ dài 4.
Còn d,e,c,a không là đường đi do (e,c) không phải là cạnh của đồ thị. Dãy b,c,f,e,b là
chu trình độ dài 4. Đường đi a,b,e,d,a,b có độ dài là 5 không phải là đường đi đơn, do

cạnh (a,b) có mặt trong nó hai lần.
a

b

d

e
f
Hình 1.6. Đường đi trên đồ thị

c a

b

d

e

c

f

Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩa hoàn toàn tương
tự như trường hợp đồ thị vô hướng, chỉ khác là ta chú ý đến hướng trên các cung.
Định nghĩa 2. Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương,
trên đồ thị có hướng G=(V,A) là dãy
xo, x1 , ... , xn-1 , xn
trong đó u=x0 , v=xn , ( xi , xi+1 ) ∈ A , i= 0, 1, 2 ,..., n-1.
Đường đi nói trên còn có thể biểu diễn dưới dạng các cung:

(x0 , x1 ) , ( x1 , x2), ... , ( xn-1 , xn ).
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh
đầu trùng với đỉnh cuối ( tức là u=v) được gọi là chu trình. Đường đi hay chu trình
được gọi là đơn nếu như không có cung nào bị lặp lại.
Thí dụ 2. Trên đồ thị có hướng cho trong hình 1: a,d,c,f,e là đường đi đơn độ dài 4.
Còn d,e,c,a không là đường đi do (e,c) không phải là cung của đồ thị. Dãy b,c,f,e,b là
chu trình độ dài 4. Đường đi a,b,e,d,a,b có độ dài là 5 không phải là đường đi đơn, do
cung (a,b) có mặt trong nó hai lần.
Xét một mạng máy tính .Một câu hỏi đặt ra là hai máy tính bất kỳ trong mạng
này có thể trao đổi được thông tin với nhau hoặc trực tiếp qua kênh nối chúng hợăc
thông qua một hoặc vài máy tính trung gian trong mạng? Nếu sử dụng đồ thị để biểu
diễn mạng máy tính này (trong đó các đỉnh của đồ thị tương ứng với các máy tính ,
còn các cạnh tương ứng với các kênh nối) câu hỏi đó được phát biểu trong ngôn ngữ
đồ thị như sau: Tồn tại hay chăng đường đi giữa mọi cặp đỉnh của đồ thị ?
Địng nghĩa 3. Đồ thị vô hướng G=(V,E) được gọi là liên thông nếu luôn tìm
được đường đi giữa hai đỉnh bất kỳ của nó.
Như vậy hai máy tính bất kỳ trong mạng có thể trao đổi thông tin đượcvới nhau khi và
chỉ khi đồ thị tương ứng với mạng này là đồ thị liên thông.

Trang 5


Thí dụ 3. Trong hình 1.7: Đồ thị G là liên thông, đồ thị H là không liên thông
b

H1

c
e


g

H2

f
H3
G

H

Hình 1.7. Đồ thị liên thông G và đồ thị H gồm 3 thành phần liên thông H1,H2,H3.
Định nghĩa 4. Ta gọi đồ thị con của đồ thị G=(V,E) là đồ thị H=(W,F), trong đó W ⊆
V và F ⊆E
Trong trường hợp đồ thị là không liên thông , nó sẽ rã ra thành một số đồ thị con liên
thông đôi một không có đỉnh chung. Những đồ thị con liên thông như vậy ta sẽ gọi là
các thành phần liên thông của đồ thị.
Thí dụ 4. Đồ thị H trong hình 1.7 gồm 3 thành phần liên thông là H1,H2,H3.
Trong mạng máy tính có thể có những máy ( những kênh nối ) mà sự hỏng hóc của nó
có thể ảnh hưởng đến việc trao đổi thông tin trong mạng. Các khái niệm tương ứng với
tình huống này được đưa ra trong định nghĩa sau.
Định nghĩa 5. Đỉnh v được gọi là đỉnh rẽ nhánh nếu việc loại bỏ v cùng với các cạnh
liên thuộc với nó khỏi đồ thị làm tăng số thành phần liên thông của đồ thị. Cạnh e
được gọi là cầu nếu việc loại bỏ nó khỏi đồ thị làm tăng số thành phần liên thông của
đồ thị .
Thí dụ 5. trong đồ thị G ở hình 1.7, đỉnh d và e là đỉnh rẽ nhánh, còn các cạnh (d,g) và
(e,f) là cầu.
Đối với đồ thị có hướng có hai khái niệm liên thông phụ thuộc vào việc ta có
xét đến hướng trên các cung hay không.
Định nghĩa 6. Đồ thị có hướng G=(V,A) được gọi là liên thông mạnh nếu luôn tìm
được đường đi giữa hai đỉnh bất kỳ của nó.

Định nghĩa 7. Đồ thị có hướng G=(V,A) được gọi là liên thông yếu nếu đồ thị vô
hướng tương ứng với nó là đồ thị vô hướng liên thông.

Trang 6


Rõ ràng nếu đồ thị là liên thông mạnh thì nó cũng là liên thông yếu, nhưng điều
ngược lại là không luôn đúng , như chỉ ra trong thí dụ dưới đây.
Thí dụ 6. Trong hình 1.8 đồ thị G là liên thông mạnh, còn H là liên thông yếu nhưng
không là liên thông mạnh.
a

b
a

b

e
e
c

d
c

d

Hình 1.8. Đồ thị liên thông mạnh G
Đồ thị liên thông yếu H
Một câu hỏi đặt ra là khi nào có thể định hướng các cạnh của một đồ thị vô hướng liên
thông để có thể thu được một đồ thị có hướng liên thông mạnh? Ta sẽ gọi đồ thị như

vậy là đồ thị định hướng được. Định lý dưới đây cho ta tiêu chuẩn nhận biết một đồ thị
có là định hướng được hay không.
Định lý 1. Đồ thị vô hướng liên thông là định hướng được khi và chỉ khi mỗi cạnh
của nó nằm trên ít nhất một chu trình.
Chứng minh. Điều kiện cần. Giả sử (u,v) là một cạnh của đồ thị ,từ sự tồn tại đường
đi có hướng từ u đến v và ngược lại suy ra (u,v) phải nằm trên ít nhất một chu trình.
Điều kiện đủ. Thủ tục sau đây cho phép định hướng các cạnh của đồ thị để thu được
đồ thị có hướng liên thông mạnh.Giả sử C là một chu trình nào đó trong đồ thị. Định
hướng các cạnh trên chu trình này theo một hướng đi vòng theo nó.
Nếu tất các cạnh của đồ thị là đã được định hướng thì kết thúc thủ tục. Ngược lại , chịn
C là một cạnh chưa định hướng có chung đỉnh với ít nhất một trong số các cạnh đã
định hướng.
Theo giả thiết tìm được chu trình C chứa cạnh e. Định hướng các cạnh chưa được định
hướng của C’ theo một hướng dọc theo chu trình này( không định hướng lại các cạnh
đã có hướng). Thủ tục trên sẽ được lặp lại cho đến khi tất cả các cạnh của đồ thị được
định hướng. Khi đó ta thu được đồ thị có hướng liên thông mạnh.

Trang 7


CHƯƠNG II: BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT TRONG ĐỒ THỊ

2.1. Phát biểu bài toán
Cho đồ thị có trọng số G=(V,E,w). Kí hiệu w(i,j) là trọng số của cạnh (i,j).
Độ dài đường đi:
 vn
µ = v0




v1



v2







vn-1

là tổng các trọng số
Cho hai đỉnh a, z của đồ thị. Bài toán đặt ra là tìm đường đi ngắn nhất từ a đến z.
L(µ) = ∑

2.2.

=1

(

−1,

)

Một số thuật toán tìm đường đi ngắn nhất


2.2.1. Thuật toán Dikkstra
Thuật toán
Đầu vào: Đồ thị G=(V,E,w) có trọng số w(i,j) > 0 với mọi cạnh (i,j), đỉnh a và đỉnh z.
Đầu ra: L(z) chiều dài đường đi ngắn nhất từ a đến z và đường đi ngắn nhất (nếu có).
Phương pháp:
(1) Khởi tạo: Gán L(a):=0. Với mọi đỉnh x ≠ a gán L(x) = ∞. Đặt T:=V
(2)

Chọn v ∈ T sao cho L(v) có giá trị nhỏ nhất, tức là
L(v) := min{ L(u) | u ∈ T}

Đặt
T:= T – {v}
(3) Nếu z= v, kết thúc, L(z) là chiều dài đường đi ngắn nhất từ a đến z
Từ z lần ngược theo đỉnh được ghi nhớ ta có đường đường đi ngắn
nhất. Ngược lại, nếu z ≠ v, sang bước 4
Nếu giá trị nhỏ nhất ở bước 2 là ∞, kết thúc, kết luận không tồn tại đường
đi từ a đến z.
(4)

Với mỗi x ∈ T kề v, nếu L(x) > L(v) + w(v,x), thì gán L(x) := L(v) + w(v,x)

Và ghi nhớ đỉnh v cạnh đỉnh x để sau này xây dựng đường đi ngắn nhất.
Quay về bước (2).

Ví dụ minh họa
Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị sau:

a
3


7
6

f

5

g

Trang 8


Thực hiện bước 1:
Đặt T:= {a,b,c,d,e,f,g,z}

L(a):=0, L(b)=L(c)=L(d)=L(e)=L(f)=L(g)=L(z):= ∞
Các tham số được biểu diễn trên đồ thị như sau:

1
a

z
6

Thực hiện bước 2:
Suy ra v=a và T := T - {a} = {b,c,d,e,f,g,z}
L(a) = min{L(x) | x ∈ T} = 0

Thực hiện bước 3: Vì z ≠ v, sang bước 4


Thực hiện bước 4:
Đỉnh b và f kề đỉnh a. Ta có
L(b) := min{L(b), L(a)+2} = 2
L(f) := min{L(f), L(a)+1} = 1
Các đỉnh khác không thay đổi. Đồ thị có các nhãn như sau
Ghi chú: Các chữ cái bên phải ở mỗi đỉnh là nhãn đỉnh đạt giá trị nhỏ nhất ở các
biểu thức tính min.
Thực hiện bước 2:
Suy ra v=f và T := T - {f} = {b,c,d,e,g,z}
Thực hiện bước 4:
Đỉnh d và đỉnh g kề đỉnh f. Ta có
L(f)= min{L(x) | x ∈ T}=1

Thực hiện bước 3: Vì z ≠ v, sang bước 4

L(d) := min{L(d), L(f)+3} = min{∞,1+3} = 3
L(g) := min{L(g), L(f)+5} = min{∞,1+5} = 6

Các đỉnh khác không thay đổi. Đồ thị có nhãn như sau
Thực hiện bước 2:
Suy ra v=b và
T := T - {b} = {c,d,e,g,z}
L(b) = min{ L(x) | x ∈ T} = 2

Thực hiện bước 3: Vì z ≠ v, sang bước 4

Trang 9



Thực hiện bước 4:
Đỉnh c,d ,và e kề đỉnh b. Ta có
L(d) := min{L(d), L(b)+2} = min{4,2+2} = 4
Các đỉnh khác không thay đổi. Đồ thị có nhãn như sau
L(c) := min{L(c), L(b)+2} = min{∞,2+2} = 4

L(e) := min{L(e), L(b)+4} = min{∞,2+4} = 6

Thực hiện bước 2:
Suy ra v=c và T := T - {c} = {d,e,g,z}
Thực hiện bước 4:
Đỉnh e và z kề đỉnh c. Ta có
L(c) = min{L(x) | x ∈ T}= 4

Thực hiện bước 3: Vì z≠v, sang bước 4

L(e) := min{L(e), L(c)+3} = min{6,4+3} = 6 L(z) := min{L(z), L(c)+1} = min{∞,4+1} = 5

Các đỉnh khác không thay đổi. Đồ thị có nhãn như sau:
Thực hiện bước 2:
Suy ra v=d và T := T - {d} = {e,g,z}
Thực hiện bước 4:
Đỉnh e kề đỉnh d. Ta có
L(e) := min{L(e), L(d)+4} = min{6,4+4} = 6
Các đỉnh khác không thay đổi. Đồ thị có nhãn như sau:
L(d) := min{L(x) | x ∈ T} = 4

Thực hiện bước 3: Vì z≠v, sang bước 4

Thực hiện bước 2:

Suy ra v=z và T := T - {z} = {e,g}
Thực hiện bước 3: Vì z=v, kết thúc
L(z)=5 là độ dài đường đi ngắn nhất từ a đến z.
  
L(z) = min{L(x) | x ∈ T} = 5

Từ z ta đi ngược lại theo các nhãn đã được ghi nhớ z c b a Ta suy ra đường đi
ngắn nhất là
  
a b c z

Phương pháp lập bảng ghi nhãn
Ta lập bảng tính toán các nhãn gồm các cột ứng với các đỉnh và các hàng ứng
với các lần tính nhãn ở bước (4). Các nhãn gạch dưới ứng với nhãn nhỏ nhất ở bước (2)
và đỉnh bị loại được ghi bên phải.
Sau khi đỉnh z bị loại, từ z ta lần ngược về đỉnh a theo nhãn ghi trên bảng. Các đỉnh
trên đường đi được gạch dưới (trên cột các đỉnh loại). Cuối cùng theo thứ tự ngược lại
ta nhận được đường đi ngắn nhất.
Sau đây là bảng tính toán nhãn của ví dụ trên
Ta suy ra đường đi ngắn nhất là
có độ dài là 5

a

  
b c z

Trang 10



Định lý: Giả sử G là đồ thị liên thông có trọng số và có n đỉnh. Gọi f(n) là số lần thuật
toán Dijkstra khảo sát một cạnh của G trong trường hợp xấu nhất.
Khi đó ta có:
2
f(n) = O(n )
Chứng minh:
Thuật toán khảo sát các cạnh ở bước(4). Vì G có n đỉnh nên số cạnh tối đa được khảo sát ở bước (4) là
n-1. Bước (4) là vòng lặp chứa các bước (2) (4). Vòng lặp thực hiện đến khi z ∄ T. Vì ở mỗi vòng lặp ta rút ra
một phần tử của T và khởi đầu T có n phần tử, nên vòng lặp được xử lý nhiều nhất n lần. Do đó
f(n) ≤ n(n-1) ≤ n2.

Ghi chú: Giả sử đồ thị K n có trọng số. Bất kì thuật giải nào tìm đường đi ngắn nhất từ
a đến z đều phải khảo sát mỗi cạnh ít nhất một lần. Vì K n có n(n-1)/2 cạnh nên thuật
2
toán phải khảo sát ít nhất O(n ) cạnh của Kn. Từ định lý trên ta thấy thuật toán Dijkstra
là tối ưu.
Cài đặt
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 100
#define MAXC 10000
char *finp="dijkstra.inp";
char *fout="dijkstra.out";
int c[MAX][MAX];
int d[MAX];
int trace[MAX];
int fre[MAX];
int n,s,f;
int kq[MAX];

/* Doc du lieu tu file */
void input()
{
FILE *fi;
int i,m,u,v;
fi=fopen(finp,"r");
if(fi!=NULL){/* n dinh, m canh, di tu s den f */
fscanf(fi,"%d%d%d%d",&n,&m,&s,&f);
for(u=1;u<=n;u++)
for(v=1;v<=n;v++)
if (u==v) c[u][v]=0;
else c[u][v] = MAXC;

Trang 11


for(i=1;i<=m;i++){
fscanf(fi,"%d%d",&u,&v);
fscanf(fi,"%d",&c[u][v]);
c[v][u] = c[u][v];
}
fclose(fi);
}
}
/* Khoi tao cac gia tri ban dau */
void init()
{
int i;
for(i=1;i<=n;i++)
d[i]=MAXC;

d[s]=0;
for(i=1;i<=n;i++)
fre[i]=1;
}
/* Giai thuat Dijkstra */
void dijkstra()
{
int i,u,v;
int min;
do
{
u=0;
min=MAXC;
for(i=1;i<=n;i++)
if((fre[i]) && (d[i]min=d[i];
u=i;
}
if ((u==0) || (u==f)) break;
fre[u]=0;
for(v=1;v<=n;v++)
if ((fre[v]) && (d[v] > (d[u] + c[u][v]))){
d[v] = d[u] + c[u][v];
trace[v] = u;
}
}
while (1!=2);
}

Trang 12



void output()
{
FILE *fp;
int i,j,k;
fp=fopen(fout,"w");
if(d[f]==MAXC)
fprintf (fp,"Khong co duong tu %d den %d",s,f);
else
{
fprintf (fp,"Duong tu %d den %d co do dai: %d\n",s,f,d[f]);
j=f;
k=0;
do
{
k++;
kq[k]=j;
j=trace[j];
}
while (j!=s);
k++;
kq[k]=s;
for (i=k;i>0;i--)
fprintf (fp,"->%d",kq[i]);
}
fclose(fp);
}
void main()
{

input();
init();
dijkstra();
output();
}
2.2.2. Thuật toán Bellman-Ford
Thuật toán Dijkstra có thể không cho kết quả đúng nếu có trọng số âm. Xét đồ thị sau

c
a

b

Trang 13


Nếu áp dụng thuật toán Dijkstra tìm đường đi ngắn nhất từ đỉnh a thì sau vòng
lặp đầu tiên ta nhận được độ dài đường đi ngắn nhất từ a đến b là 2. Tuy nhiên, đường
 
đi a c b có độ dài là 1.
Thuật toán Bellman-Ford khắc phục hạn chế trên và cho phép tìm đường đi
ngắn nhất từ một đỉnh đến các đỉnh khác mà không cần điều kiện trọng số dương.
Thuật toán này cũng giúp xác định đồ thị có chu trình trọng số âm hay không.
Thuật toán:
Đầu vào: Đồ thị có hướng G=(V,E,w), s ∈ V

Đầu ra: Danh sách L(v), độ dài đường đi (có hướng) ngắn nhất từ s đến v và danh sách P(v), đỉnh kề trước v trên đường đi ngắn nhất
từ s đến v ,v ∈ V hoặc kết luận đồ thị có chu trình âm qua đỉnh khả nối với s.

Các bước:


(1)
(2) For i:=1 to |V|-1 do
Khởi tạo: L(s) := 0; L(v) := +∞ ∀ v≠s, P(v) := nil ∀ v ∈ V.

For (u,v) ∈ E do

If L(v) > L(u) + w(u,v) then
{ L(v) := L(u) + w(u,v); P(v) := u; }
Nếu tồn tại (u,v) ∈ E thỏa L(v) > L(u) + w(u,v) thì kết luận đồ thị có chu trình

âm.
Ngược lại L(v) là độ dài đường đi (ngắn nhất) từ s đến v, và danh sách P(v), đỉnh kề trước v trên đường đi ngắn nhất từ s đến v, v ∈ V.

Định lý: Thuật toán Bellman-Ford là đúng và có độ phức tạp O(|V|.|E|).
Chứng minh:
Trước tiên ta chứng minh bổ đề sau quy nạp theo i.
Kí hiệu L1(v), v ∈ V, là giá trị L(v) sau vòng lặp thứ i, i=1..|V|-1 ở bước 2.

Bổ đề: Với mọi v ∈ V, i=1..|V|-1, L1(v) là độ dài ngắn nhất trong số các đường đi từ s đến v có trọng số cung không quá i.

Bổ đề hiển nhiên đúng với i=1. Giả sử bổ đề đúng với 1, 2, …, i-1. Ta chứng minh nó cũng đúng với i. Cho v ∈ V, ký hiệu là đường
đi ngắn nhất trong số các đường đi từ s đến v có số cung không quá I và L( ) là độ dài của .

Ta xét các trường hợp sau:
Trường hợp có số cung nhỏ hơn i: cũng là đường đi ngắn nhất trong số các đường đi từ
s đến v có số cung không vượt quá i-1 và từ giả thiết quy nạp suy ra L( ) = L i-1(v)


Li(v). Như vậy Li(v) = L( ) là độ dài đường đi ngắn nhất trong số các đường đi từ s đến v có trọng số cung không vượt quá i.


Trường hợp có số cung bằng i: Kí hiệu (u,v) là cung cuối cùng trên đường đi từ
đến ′ là đường đi trên từ s đến u. Như vậy ′ có i-1 cung và là đường đi ngắn nhất trong số các đường đi từ s đến u có số cung không quá i-1 (vì nếu có đường đi ′′ từ s đến
u ngắn hơn ′ thì đường đi ′′ ∪ (u,v) sẽ ngắn hơn , mâu thuẫn). Theo giả thiết quy nạp L( ′) = Li-1(u) và từ đó suy ra L( ) = L( ′) + w(u,v) = Li-1(u) + w(u,v). Sau vòng lặp
thứ i ta có Li(v) ≤ Li-1(u) + w(u,v) – L( ). Suy ra Li(v) = L( ) là độ dài ngắn nhất trong số các đường đi từ s đến v có số cung không quá i.

Bổ đề đã được chứng minh.

Trang 14


Theo bổ đề, sau vòng lặp, L(v) là độ dài đường đi (có hướng) ngắn nhất từ s đến v có số cung không quá |V| - 1, v ∈ V.

Giả sử tồn tại (u,v) ∈ E thỏa L(v) > L(u) + w(u,v) = L’(v). Ký
hiệu 0 là đường∪ đi
từ s đến u, là đường đi từ s đến v. Khi đó đường đi
′:=
(u,v)

là đường đi từ s đến v có độ dài L’(v) < L(v). Vậy ′ phải có ít nhất |V| cung, suy ra ′ chứa chu trình. Kí hiệu w là đỉnh lặp lại trên ′. Giá trị L(w) ở lần xuất hiện sau trên ′
phải nhỏ hơn ở lần xuất hiện trước. Suy ra chu trình có trọng số âm.

Độ phức tạp O(|V|.|E|) suy ra từ việc thực hiện |V| vòng lặp với mỗi vòng lặp
thực hiện |E| phép toán.
Phương pháp xác định đường đi ngắn nhất từ s đến v
Đặt v0 := v; v1 := P(v0); v2 := P(v1); … ; vi := P(vi-1); … vk:= P(vk-1)=s
Suy ra đường đi ngắn nhất từ s đến v là
s = vk




vk-1







v1



v0 = v

2.2.3. Thuật toán Floyd
Thuật giải tìm độ dài đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng có trọng số (không bắt buộc ≥0).

Thuật toán:
Đầu vào: Đồ thị G=(V,E), V={1, 2, …, n}, có trọng số w(i,j) với mọi cung (i,j).
Đầu ra: Ma trận D=[d(i,j)], trong đó d(i,j) là chiều dài đường đi ngắn nhất từ i đến j
với mọi cặp (i,j).
Phương pháp:
(1) Bước khởi tạo: Ký hiệu D0 là ma trận xuất phát D0=[d0(i,j)]
Trong đó d0(i,j) = w(i,j) nếu tồn tại cung (i,j) và d0(i,j) = +∞ nếu không tồn tại cung (i,j) (đặc biệt nếu không có khuyên tại i thì d0(i,i) = +∞).

Gán k:=0
(2) Kiểm tra kết thúc. Nếu k=n, kết thúc. D=Dn là ma trận độ dài đường đi
ngắn nhất. Ngược lại tăng k lên 1 đơn vị (k:=k+1) và sang bước (3).
(3) Tính ma trận Dk theo Dk-1

Với mọi cặp (i,j), i=1..n, j=1..n thực hiện:
Nếu dk(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 đặt
dk(i,j) := dk-1(i,j)
Quay lại bước (2).
Định lý: Thuật toán Floyd là đúng
Chứng minh:
Ta chứng minh, bằng quy nạp theo k, mệnh đề sau:
dk(i,j) là chiều dài đường đi ngắn nhất trong những đường nối đỉnh i đến j qua các đỉnh
trung gian {1,2,..,k}
Bước cơ sở: Hiển nhiên mệnh đề đúng với k=0
Bước quy nạp: Giả sử mệnh đề đúng với k-1. Xét dk(i,j)
Sẽ xảy ra một trong hai trường hợp sau:

Trang 15


Trong các đường nối đỉnh i với j qua các đỉnh trung gian {1,2,..,k-1,k} có chiều
dài ngắn nhất, tồn tại một đường p không qua đỉnh k. Khi đó p cũng là đường đi ngắn
nhất nối đỉnh i với j qua các đỉnh trung gian {1,2,..,k-1}, nên theo giả thiết quy nạp dk-1(i,j) = d(p) ≤ dk-1(i,k) + dk-1(k,j)

Do đó theo cách tính dk ta có dk(i,j) = dk-1(i,j) = d(p) là độ
dài đường đi ngắn nhất từ i đến j qua các đỉnh trung gian
{1,2,..,k-1,k}
Mọi đường nối đỉnh i với j qua các đỉnh trung gian {1,2,..,k-1,k} có chiều dài
ngắn nhất đều qua đỉnh k. Gọi p = (i,..,k,..,j) là một đường đi ngắn nhất nối đỉnh i với j
qua các đỉnh trung gian {1,2,...,k-1,k}. Khi đó đoạn (i,…,k) và (k,…,j) cũng phải là
các đường đi ngắn nhất qua các đỉnh trung gian {1,2,..,k-1}. Ta có dk-1(i,k) + dk-1(k,j) =
d(p) < dk-1(i,j)

(Bất đẳng thức cuối cùng cũng suy ra từ giả thiết mọi đường đi nối đỉnh i với j qua các
đỉnh trung gian {1,2,..,k-1,k} có chiều dài ngắn nhất đều qua đỉnh k).
Do đó theo cách tính dk ta có dk(i,j) = dk-1(i,k) + dk-1(k,j) = d(p) là độ dài đường
đi ngắn nhất từ i đến j qua các đỉnh trung gian {1,2,..,k-1,k}.
Hệ quả:
Nếu ma trận kết quả của thuật toán Floyd có phần tử hữu hạn trên đường chéo
i=i thì đồ thị chứa chu trình.
Nếu ma trận kết quả chứa các phần tử +∞ ngoài đường chéo i=i thì đồ thị không liên thông mạnh.

Ghi chú: Từ hệ quả trên ta có thể sử dụng thuật toán Floyd, với w(i,j)=1 nếu tồn tại
cung (i,j) và w(i,j)=+∞ nếu không tồn tại cung (i,j), để xác định xem đồ thị có chu

trình hay có liên thông hay không.
Ví dụ:

Áp dụng thuật toán Floyd ta có:
Ma trận khoảng cách xuất phát D0 là (các ô trống là ∞)

D0

Trang 16


Từ ma trận D0 , theo thuật toán, ta xây dựng các ma trận tiếp theo như sau (các ô gạch
dưới có giá trị thay đổi).

Đỉnh
1
2
D1 =


3
4
5
6

Đỉnh
1
2
D2 =

3
4
5
6

Đỉnh
1
2
D3 =

3
4
5
6

Trang 17


Đỉnh

1
2
D4 =

3
4
5
6

Đỉnh
1
2
D5 =

3
4
5
6

Đỉnh
1
2
D=D0=

3
4
5
6
Cuối cùng, D là ma trận khoảng cách ngắn nhất giữa các đỉnh.
Theo hệ quả ta thấy đồ thị liên thông mạnh và chứa chu trình.

2.2.4. Thuật toán Floy-Warshall
Thuật giải tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị
có hướng có trọng số.
Thuật toán:
Đầu vào: Đồ thị G=(V,E,w), V={1, 2,… ,n}, có trọng số với mọi
cung (i,j).
Đầu ra: Ma trận D=[d(i,j)] trong đó d(i,j) là chiều dài đường đi
ngắn nhất từ i đến j với mọi cặp (i,j).
Trang 18


Ma trận P=[p(i,j)] dùng để xác định đường đi ngắn nhất.
Phương pháp:
(1) Bước khởi tạo: Ký hiệu D0 là ma trận xuất phát
D0 = [d0(i,j)]
Trong dó d0(i,j) = w(i,j) nếu tồn tại cung (i,j) và d0(i,j) = +∞ nếu không tồn tại cung (i,j) (đặc biệt nếu không có khuyên tại i thì d0(i,j) = +∞).

P0 = [p0(i,j)]
Trong đó p0(i,j) = j nếu có cung từ i đến j và p0(i,j) không xác định nếu không
có cung từ i đến j. Gán k:=0
(2) Kiểm tra kết thúc:
Nếu k=n, kết thúc. D=Dn là ma trận độ dài đường đi ngắn nhất, P=Pn.
Ngược lại, nếu k(3) Tính ma trận Dk và Pk theo Dk-1 và Pk-1:
Với mọi cặp (i,j) , i=1..n, j=1..n, thực hiện:
dk(i,j) := dk-1(i,k) + dk-1(k,j)

pk(i,j) := pk-1(i,k)
ngược lại đặt
dk(i,j) := dk-1(i,j)


pk(i,j) := pk-1(i,j)
Quay lại bước (2).
Phương pháp pháp xác định đường đi ngắn nhất từ đỉnh i đến đỉnh j: Đường đi
ngắn nhất từ đỉnh i đến đỉnh j gồm dãy các đỉnh.
i, i1, i2, i3, …, ik, ik+1, im, j
thỏa mãn
i1=p(i,j), i2=p(i1,j), …, ik+1=p(ik,j), …, p(im,j)=j
Định lý: Thuật toán Floyd-Warshall là đúng.
Chứng minh:
Ở định lý 1 ta đã chứng minh D là ma trận độ dài đường đi ngắn nhất.
Bây giờ ta chỉ cần chứng minh thêm rằng phương pháp xây dựng đường đi theo ma
trận P như ở thuật toán thực sự cho đường đi ngắn nhất.
Với mỗi cặp đỉnh (i,j) có dk(i,j) < +∞, ký hiệu ( , ) = (i, i1, i2, …, in, in+1, im, j)

Là đường đi từ i đến j được xây dựng trên cơ sở ma trận Pk như sau:
i1=pk(i,j), i2=pk(i1,j), …, in+1=pk(in,j), …, pk(im,j)=j

Ta chứng minh, bằng quy nạp theo k, bổ đề sau:
Bổ đề: μk(i, j) có độ dài là dk(i,j), tức là đường đi ngắn nhất trong những đường nối đỉnh i đến j qua các đỉnh trung gian {1, 2,…, k}

- Bước cơ sở: Hiển nhiên mệnh đề đúng với k=0.
- Bước quy nạp: Giả sử mệnh đề đúng với k-1. Xét

i1=pk(i,j), i2=pk(i1,j), …, in+1=pk(in,j), …, pk(im,j)=j
Ta xét hai khả năng sau:
Trường hợp dk(i,j)=dk-1(i,j). Suy ra
Trang 19



pk(i,j)=pk-1(i,j) => i1=pk-1(i,j) ∈ {1, 2,…, k-1} và (i,i1) ∈ E (theo giả thiết quy nạp). Ta chứng minh dk(i1,j)=dk-1(i1,j)

Giả sử ngược lại dk(i1,j)có dk-1(i1,j)>dk-1(i1,k)+dk-1(k,j)
Suy ra
(bất đẳng thức tam giác)
dk-1(i,k) + dk-1(k,j) ≤ dk-1(i,i 1) + dk-1(i1,k) + dk-1(k,j)

<

dk-1(i,i1) + dk-1(i1,j) ≤ dk-1(i,j) (bất đẳng thức tam giác)

Suy ra dk(i,j) = dk-1(i,j), mâu thuẫn với dk(i,j) < dk-1(i,j).
Vậy ta có dk(i,j) = dk-1(i1,j).
Từ đó, tương tự như trên suy ra
Tương tự, với mọi h=0,…,m truy hồi ta nhận được
pk(i1,j) = pk-1(i1,j) => i2 = pk-1(i1,j) ∈ {1, 2, …,k-1} và (i1,i 2) ∈ E.

pk(ih,j)=pk-1(ih,j) và ih+1=pk-1(ih,j) ∈ {1, 2, …,k-1} và (ih,ih+1) ∈ E.

Vậy ( , ) ≡

−1(

, ) là đường đi ngắn nhất trong những đường nối đỉnh i đến j qua các đỉnh trung gian {1, 2, …,k-1}, có chiều dài bằng

dk-1(i,j). Mà dk(i,j) = dk-1(i,j) nên nó cũng đường đi ngắn nhất trong những đường nối
đỉnh i đến j qua các đỉnh trung gian {1, 2, …,k}, có chiều dài bằng dk(i,j).
Trường hợp dk(i,j) < dk-1(i,j). Ta có
dk(i,j)=dk-1(i,k)+dk-1(k,j)

Xét i1=pk(i,j)=pk-1(i,k) ∈

−1( , ). Ta chứng minh

dk-1(i1,k) + dk-1(k,j) < dk-1(i1,j) (*) Giả sử ngược lại dk-1(i1,k) + dk-1(k,j) ≥ dk-1(i1,j). Khi đó ta có
dk-1(i,i 1) + dk-1(i1,k) + dk-1(k,j) ≥ dk-1(i,i1) + dk-1(i1,j) ≥ dk-1(i,j)

Mặt khác, do i1=pk-1(i,k) ∈ {1, 2, …,k-1} nằm trên đường đi

−1(

, ), nên dk-1(i,i1) + dk-1(i1,k) = dk-1(i,k). Suy ra dk-1(i,k) + dk-1(k,j) ≥ dk-1(i,j), mâu thuẫn.

Như vậy (*) đúng, và ta có
dk(i1,j) = dk-1(i1,k) + dk-1(k,j) & pk(i1,j) = pk-1(i1,k)
Truy hồi, ta chứng minh được rằng tồn tại h sao cho
Tức là
Tiếp theo, ta có
Suy ra
dk(i,k) = dk-1(i,k) và dk(k,j) = dk-1(k,j)
kéo theo i2 = pk(i1,j) = pk-1(i1,k) ∈

−1( , ).

{i3, i4, …, ih=k} ⊂

−1(

, )=


−1( , )

( , )⊂

( , )

dk(i,k) + dk(k,j) ≥ dk(i,j) = dk-1(i,k) + dk-1(k,j)

Theo trường hợp (i) (áp dụng cho cặp đỉnh (k,j)), ( , )=

−1(

, ) là đường đi ngắn nhất trong những đường nối đỉnh k đến j qua các đỉnh trung gian {1, 2, …, k-

1}, có chiều dài bằng dk(k,j). Mặt khác theo cách xây dựng ( , ), thì ( , ) là nối của hai đường đi ( , ) và ( , ): ( , ) = ( , ) ∪ ( , ) và có độ dài
bằng dk(i,j). Từ đó suy ra ( , ) là đường đi ngắn nhất trong những đường nối đỉnh i đến j qua các đỉnh trung gian {1, 2, …, k}.

Bổ đề được chứng minh xong.
Từ bổ đề này suy ra điều cần chứng minh vì ( , ) =

( , ).

Trang 20


Ví dụ: Xét đồ thị

c

Áp dụng thuật toán Floyd-Warshall ta nhận được các ma trận sau:

Các ma trận xuất phát:

a

D0

=

b
c
d

Các ma trận cập nhật qua đỉnh a: (các giá trị mới được gạch chân)

a
D1

=

b
c

d


Trang 21


×