LỜI NÓI ĐẦU

Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu đờivà có nhiều
ứng dụng hiện đại.Những tư tưởng cơ bản của lý thuyết đồ thị đươc đề xuất từ
những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy Sĩ Leonhard
Euler.Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cái
cầu ở thàng phố Konigsberg.
Đồ thị được sử dụng để giải quyết các bài toán trong nhiều lĩnh vực khác
nhau .Chẳng hạn , đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề
giải tích mạch điện.Chúng ta có thể phân biệt các hợp chất hoá học hữu cơ khác
nhau với cùng công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ
thị.Chúng ta có thể xác định xem hai máy tính trong mạng có thể trao đổi thông tin
được với nhau hay không nhờ mô hình đồ thị của mạng máy tính. Đồ thị có trọng
số trên các cạnh có thể sử dụng để giải các bài toán như : tìm đường đi ngắn nhất
giữa hai thành phố trong cùng một mạng giao thông . Chúng ta còn sử dụng đồ thị
để giải các bài toán về lập lịch,thời khoá biểu,và phân bố tần số cho các trạm phát
thanh và truyền hình....
Bài toán tìm đường đi ngắn nhất là vấn đề quan trọng trong lý thuyết đồ thị,
nó đã được nghiên cứu từ lâu và có nhiều ứng dụng trong nhiều ngành khoa học
nói chung và khoa học máy tính nói riêng. Nhiều giải thuật (Dijkstra, BellmanFord, Floyd...) đã được phát triển để tìm đường đi ngắn nhất cho một cặp đỉnh hay
cho tất cả các cặp đỉnh. Bài viết này nghiên cứu bài toán tìm đường đi ngắn nhất
giữa hai tập đỉnh trên đồ thị và đề xuất một giải thuật hiệu quả để giải bài toán
này.

Chương I : LÝ THUYẾT VỀ THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN

NHẤT
I.1

Các khái niệm cơ bản của lý thuyết đồ thị
I.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
Hà Tây
Đồng Nai
Huế
An Giang

Hà Nội

Bình Định

TPHCM

Quãng Ngãi
Phú Yên

Khánh Hòa

Hình 1.Sơ đồ mạng máy tính
Nhận thấy rằng trong mạng hình 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 2.

Hai cạnh e1 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.Mạng như vậy được cho trong hình 3. nhưng không phải đa đồ thị nào cũng là đơn đồ thị. Sơ đồ mạng máy tính với kênh thông báo. bởi vì có những khuyên (cạnh nối một đỉnh vói chính nó). Đa đồ thị vô hướng G=(V. 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 . Sơ đồ mạng máy tính với đa kênh thoại Định nghĩa 2.E) bao gồm V là tập các đỉnh . vì trong đa đồ thị có hai hay nhiều hơn cạnh nối một cặp đỉnh nào đó. Đồng Nai Hà Tây Hà Nội Quãng Ngãi Huế An Giang Bình Định TPHCM Phú Yên Khánh Hòa Hình 3.Đồng Nai Hà Tây Hà Nội Huế An Giang Bình Định HCM Quãng Ngãi Phú Yên Khánh Hòa Hình 2. Rõ ràng mỗi đơn đồ thị đều là đa đồ thị. được định nghĩa như sau: . 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).Như vậy đa đồ thị không thể mô tả được mạng như vậy.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.

E) bao gồm V là tập các đỉnh. Nếu trong mạng có thể có đa kênh thoại một chiều.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. để cho ngắn gọn .u). 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ị. Các kênh thoại trong mạng máy tính có thể chỉ cho phép truyền tin theo một chiều.2. Hà Tây Hà Nội Đồng Nai Huế An Giang Bình Định TPHCM Phú Yên Khánh Hòa Hình 4.ta xét các thuật ngữ mô tả các đỉnh và cạnh của đồ thị vô hướng.E)bao gồm V là tập các đỉnh. ta sẽ bỏ qua tính từ đơn mỗi khi nhắc đến chúng.1. Mạng máy tính với các kênh thoại một chiều Ta đi đến định nghĩa sau: Định nghĩa 4. và E là họ các cặp không có thứ tự gồm hai phần tử (không nhất thiết phải khác nhau) của V gọi là các cạnh.Trước tiên . Giả đồ thị vô hướng G=(V.Vì vậy. Đa đồ thị có hướngG=(V. 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. I.E) bao gồm V là tập các đỉnh. có một số máy chỉ có thể gửi tin đi . .Cạnh e được gọi là khuyến nếu có dạng e=(u.Định nghĩa 3.ta sẽ phải sử dụng đến khái niệm đa đồ thị có hướng: Định nghĩa 5.Hai cung e1 va e2 tương ứng với cùng một cặp đỉnh được gọi là cung lặp.còn các kênh thoại cho phép truyền tin theo cả hai chiều được thay thế bởi hai cạnh có hướng ngược chiều nhau. 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 đồ thị có hướng G=(V.Chẳng hạn trong hình 4 máy chủ ở Hà Nội chỉ có thể nhận tin từ các máy ở địa phương.

b c d a f e g Hình 1. . Đồ thị vô hướng Thí dụ .Trong ví dụ trên đỉnh g là đỉnh cô lập.v) là cạnh của đồ thị thì ta nói cạnh này là cạnh liên thuộc với hai đỉnh u và v. Hai đỉnh u va v của đồ thị có hướng G được gọi là kề nhau nếu (u. Khi đó 2m=∑ deg(v) vV Chứng minh. đồng thời các đỉnh u và v sẽ được gọi là các đỉnh đầu của cạnh (u. deg(d)=1 . Đỉnh bậc 0 gọi là đỉnh cô lập .v) là cạnh của đồ thị G. ta đưa vào định nghĩa sau : Định nghĩa 2.v). hoặc cũng nói là cạnh e nối đỉnh u và đỉnh v. Đồ 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.số đỉnh bậc lẻ(nghĩa là có bậc là số lẻ) là một số chẵn. Trong đồ thị vô hướng. Để có thể biết có bao nhiêu cạnh liên thuộc với một đỉnh . Rõ ràng trong mỗi cạnh e=(u. deg(e)=3 .ta có 2m=6n. Hệ quả. 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 của đỉnh có tính chất sau : Định lý 1. 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. a và d là các đỉnh treo. deg(c)=4 .Từ đó suy ra số cạnh của đồ thị là 3n.v) được tính một lần trong deg(u) và một lần trong deg(v). deg(f)=3. ta có deg(a)=1. Giả sử G=(V. deg(b)=4 .E) là đồ thị vô hướng với m cạnh . deg(g)=0. đỉnh bậc 1 được gọi là đỉnh treo . Xét đồ thị cho trong hình 1.Nếu e=(u.Định nghĩa 1.

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ó. trong nhiều trường hợp sẽ thuận tiện hơn nếu ta bỏ qua hướng trên .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.v) là cung của đồ thị có hướng G thì ta nói hai đỉnh u và vlà kề nhau. Đồ thị có hướng G Thí dụ 3. Đinh u (v) sẽ được gọi là đỉnh đầu (cuối) của 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. deg+(e)=2 Do mỗi cung (u. Giả sử G=(V. Xét đồ thị cho trong hình 2. do tất cả các số hạng của nó là số lẻ. deg-(d)=2. nên tổng này phải gồm một số chẵn các số hạng.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)). deg+(a)=3. số đỉnh bậclẻ phải là số chẵn. Tương tự như khái niệm bậc. deg-(c)=2. deg-(e)=2. Thực vậy.Nếu e=(u. a e b c d Hình 2.và nói cung(u. deg-(b)=2.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. Định nghĩa 3. Định nghĩa 4.E) là đò thị có hướng . deg+(d)=2. 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ị. đố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. Ta có deg-(a)=1.v).Vì vậy . Vì vậy. deg+(b)=1 deg+(c)=1.Chứng minh. Ta xét các thuật ngữ tương tự cho đồ thị có hướng.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.

A) là dãy xo.e.. x1 ) . Đường đi trên đồ thị 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. x1 ..b có độ dài là 5 không phải là đường đi đơn. x1 ) . xn ). Đường đi a. 1.c..d.1.. v=xn .e. Đồ 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. Đườ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..f. ( xi . Đường đi độ dài n từ đỉnh u đến đỉnh v. 2 . trong đó n là số nguyên dương. ( xi . Đường đi độ dài n từ đỉnh u đến đỉnh v. . trên đồ thị vô hướng G=(V. v=xn ... . n-1. Thí dụ 1. xn-1 .e. ( xn-1 . 1. Dãy b. i= 0. ( x1 .. .c. trên đồ thị có hướng G=(V...b) có mặt trong nó hai lần. chỉ khác là ta chú ý đến hướng trên các cung.c) không phải là cạnh của đồ thị.. ( xn-1 . x2).. x1 . Đường đi nói trên còn có thể biểu diễn dưới dạng các cung: (x0 . Định nghĩa 1. . I. . chu trình .b là chu trình độ dài 4. a d b e c a b f d e Hình 1.. n-1.3. Còn d. xn ). xi+1 )  A . Trên đồ thị vô hướng cho trong hình 1: a. i= 0. đồ thị liên thông. còn đỉnh v gọi là đỉnh cuối của đường đi.d. x2)...b.a không là đường đi do (e. xn trong đó u=x0 . Định nghĩa 2. .a. xn trong đó u=x0 .các cung của đồ thị. trong đó n là số nguyên dương. Đường đi có đỉnh đầu trùng với đỉnh cuối ( tức là u=v) được gọi là chu trình. ..c. xi+1 )  E . xn-1 .f. do cạnh (a. Định nghĩa đường đi. .E) là dãy xo. Đỉnh u gọi là đỉnh đầu.e là đường đi đơn độ dài 4. . 2 . ( x1 . Đường đi nói trên còn có thể biểu diễn dưới dạng các cạnh: (x0 .

đồ thị H là không liên thông a b H1 c d e H2 g f H3 G H Hình 2. 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ị. Còn d. Thí dụ 3.e là đường đi đơn độ dài 4. Trong hình 2: Đồ thị G là liên thông.H3. Định nghĩa 4.f.b là chu trình độ dài 4. Dãy b. trong đó W  V và F  E Trong trường hợp đồ thị là không liên thông .a.c.c) không phải là cung của đồ thị.c. do cung (a. Đồ thị vô hướng G=(V. Trên đồ thị có hướng cho trong hình 1: a. nó sẽ rã ra thành một số đồ thị con liên thông đôi một không có đỉnh chung.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 .e.H2.a không là đường đi do (e.e. . Ta gọi đồ thị con của đồ thị G=(V.b. Đườ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 a.b có độ dài là 5 không phải là đường đi đơn. Đườ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. còn đỉnh v gọi là đỉnh cuối của đường đi.F).f. 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. 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. Xét một mạng máy tính . Thí dụ 2.b) có mặt trong nó hai lần.E) là đồ thị H=(W. Đồ thị liên thông G và đồ thị H gồm 3 thành phần liên thông H1.d.c.e.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ó.d.Đỉnh u gọi là đỉnh đầu.

như chỉ ra trong thí dụ dưới đây. Định nghĩa 7. Trong hình 3 đồ thị G là liên thông mạnh.Thí dụ 4. Thí dụ 6.H3.f) là cầu. 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 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ò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 3. nhưng điều ngược lại là không luôn đúng . Định nghĩa 6. còn các cạnh (d. Đồ thị có hướng G=(V. 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ị .g) và (e. Đồ 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 đồ . Định nghĩa 5. đỉnh d và e là đỉnh rẽ nhánh. trong đồ thị G ở hình 2. Đồ thị có hướng G=(V. Đồ thị H trong hình 2 gồm 3 thành phần liên thông là H1.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.H2.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ó. Đố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. Rõ ràng nếu đồ thị là liên thông mạnh thì nó cũng là liên thông yếu. 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. Thí dụ 5.

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.. nếu (u. Điều kiện cần.2 Các khái niệm mở đầu về đề tài cần đề cập tới I.t)=  từ đó . thì ta thu được định nghĩa độ dài đuờng đi như là số cung của đường đi. v1 .(Chú ý rằng nếu chúng ta gán trọng số cho tất cả các cung đều bằng 1.t) và còn gọi là khoảng cách từ s đến t (khoảng cách định nghĩa như vậy có thể là số âm ). thì độ dài của nó được định nghĩa là tổng sau: p ∑a(vi-1.2. nghĩa là .thị như vậy là đồ thị định hướng được. Điều kiện đủ.Nếu như không tồn tại đường đi từ s đến t thì ta đặt d(s.Giả sử C là một chu trình nào đó trong đồ thị. Định lý 1. 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. Bài toán tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng quát có thể được phát biểu dưới dạng tổng quát như sau : Tìm đường đi có độ dài nhỏ nhất từ một đỉnh xuất phát s  V đến đỉnh cuối (đích) t  V. Đị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). vi) i=1 tức là . Theo giả thiết tìm được chu trình C chứa cạnh e. Ngược lại . . độ dài của đường đi chính là tổng các trọng số trên các cung của nó.v)=  .. Đường đi như vậy sẽ gọi là đường đi ngắn nhất từ s đến t còn độ dài của nó sẽ kí hiệu là d(s.E) và |V|=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.v)  E .v) là một cạnh của đồ thị . Chứng minh.|E|=m với các cung được gán trọng số. .v) gọi là trọng số của nó. Khi đó ta thu được đồ thị có hướng liên thông mạnh I.Nếu dãy v0. Giả sử (u.v) phải nằm trên ít nhất một chu trình. vp là một đường đi trên G.v)  E của nó được đặt tương ứng với một số thực a(u. 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. Đồ 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 ta sẽ đặt a(u. Đị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.1 Mở đầu Trong phần này chúng ta chỉ xét đồ thị có hướng G=(V. mỗi cung (u. Định hướng các cạnh trên chu trình này theo một hướng đi vòng theo nó.từ sự tồn tại đường đi có hướng từ u đến v và ngược lại suy ra (u.

Khi thể hiện kỹ thuật tính toán này trên máy tính.v.t) Thực vậy đỉnh v như vậy chính là đỉnh đi trước đỉnh t trong đường đin ngắn nhất từ s đến t.ta tính cận trên d[v] của khoảng cách từ s đến tất cả các đỉnh v  V.Thứ tự chọn này có ảnh hưởng rất lớn đến hiệu quả thuật toán.Mỗi khi phát hiện d[u]+a[u.u. bởi vì. Sơ đồ tính toán mà ta vừa mô tả còn chưa là xác định.v]. Quá trình đó sẽ kết thúc khi nào chúng ta không làm tốt thêm được bất cứ cận trên nào. chỉ cần chú ý là đối với cặp đỉnh s.v  V.nếu trong đồ thị có chu trình với độ dài âm(gọi là chu trình âm) thì khoảng cách giữa 1 số cặp đỉnh nào đó của đồ thị có thể là không xác định.2.t) = d(s.thì trong đường đi ngắn nhất không có đỉnh nào lặp lại(đường đi như thế gọi là đường đi cơ bản).v)..Hiện nay vẫn chưa biết thuật toán nào cho phép tìm đường đi ngắn nhất giữa hai đỉnh làm việc thực sự hiệu quả hơn những thuật toán tìm đường đi ngắn nhất từ một đỉnh đến tất cả các đỉnh còn lại.3 Thuật toán Dijkstra_Bài toán ví dụ cụ thể (trường hợp ma trận trọng số không âm) . Từ giả thiết về tính không âm của các trọng số dễ dàng suy ra rằng dãy t.Rõ ràng dãy thu được xác định đường đi ngắn nhất từ s đến t.còn việc tính lại các cận trên này sẽ gọi là phép gán nhãn cho đồ thị và toàn bộ thủ tục thường gọi là thủ tục gán nhãn. bằng cách đi vòng theo chu trình này một số đủ lớn lần.Khi đó. I. thì đường đi ngắn nhất từ s đến t... Mặt khác.2. ta có thể chỉ ra đường đi giữa các đỉnh này có độ dài nhỏ hơn bất kì số thực cho trước nào. có thể tìm một cách dễ dàng. trong trường hợp trọng số không âm. Trong truờng hợp như vậy . Nhận thấy rằng để tính khoảng cách từ s đến tất cả các đỉnh còn lại của đồ thị. bởi vì nó chứa bài toán xét sự tồn tại đường đi Hamintơn trong đồ thị như là một trường hợp riêng.u.u)+a(u. rõ ràng giá trị của mỗi d[v] sẽ cho ta khoảng cách từ mỗi đỉnh s đến v. bởi vì còn phải chỉ ra thứ tự chọn các đỉnh u và v để kiểm tra điều kiện (1). Để tìm đường đi .v) + a(v. Trước hết cần chú ý rằng nếu biết khoảng cách từ s đến t.2 Đường đi ngắn nhất xuất phát từ một đỉnh Phần lớn các thuật toán tìm khoảng cách giữa hai đỉnh s và t được xây dựng nhờ kỹ thuật tính toán mà ta có thể mô tả đại thể như sau: từ ma trận trọng số a[u.v].v]<d[v] (1) cận trên d[v] sẽ được tốt lên : d[v]=d[u]+a[u.ta thấy chu trình trong đồ thị có độ dài dương.Tiếp theo ta có thể tìm được u sao cho d(s. có thể đặt vấn đề tìm đường đi cơ bản ngắn nhất. cận trên d[v] sẽ được gọi là nhãn của đỉnh v. tuy nhiên bài toán đặt ra sẽ trở nên phức tạp hơn rất nhiều.t  V tuỳ ý (s  t) luôn tìm được đỉnh v sao cho: d(s. I.... không chứa đỉnh lặp lại và kết thúc ở đỉnh s.v)=d(s.

Truoc [v]:=s. u. Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi ngắn nhất từ s đến nó. (*Đầu vào : Đồ thị có hướng G=(V. end.E) với n đỉnh. end. v]. Định lý 1.Thuật toán Dijkstra tìm đường đi có độ dài ngắn nhất trên đồ thị sau nhãn thời gian cỡ O(n2). ma trận trọng số.v]  0. Thuật toán được xây dựng trên cơ sở hán cho các đỉnh các nhãn tạm thời. T:=T\{u}.Nếu nhãn của một đỉnh nào đó trở thành cố định thì nó sẽ cho ta không phải là cận trên mà là độ dài đường đi ngắn nhất từ đỉnh s đến nó. . s  V là đỉnh xuất phát. a[u. truoc[v]:=u. end. do Begin d[v]:=a[s.(* T là tập các đỉnh có nhãn tạm thời *) (*Bước lặp*) While T   do Begin Tim dinh u  T thỏa mãn d[u]=min {d[z]:z  T}.Trong trường hợp trọng số trên các cung là không âm thuật toán do Dijkstra đề nghị để giải quyết bài toán tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại của đồ thị làm việc hữu hiệu hơn rất nhiều so với thuật toán khác.v  V. d[s]:=0.v] then Begin d[v]:=d[u]+a[u.(*cố định nhãn của đỉnh u*) For v  T do (*gán nhãn lại cho csc đỉnh trong T*) If d[v]>d[u]+a[u.v].v]  V. Các nhãn này sẽ được biếndổi theo thủ tục lặp.Thuật toán được mô tả như sau: Procedure Dijkstra. mà ở mỗi một bước lặp có một nhãn tạm thời trở thành nhãn cố định .v  V Đầu ra : khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v]. *) Begin(*khởi tạo*) For v  V.T:=V\{s}. End. Giả thiết : a[u.

v  V.Do trọng số trên các cung là không âm . tức là nó đi qua ít nhất một đỉnh của tập S2.Do ở lần lặp đầu tiên S1={s} và sau mỗi lần lặp ta chỉ them vào S1 một đỉnh u* nên giả thiết là d(v) cho độ dài đường đi ngắn nhất từ s đên v với mọi v  S1 là đúng với bước lặp đầu tiên . nên đoạn đường từ s đến u* cóđọ dài L>0 và d(z) < d(u*) .Theo qui nạp là suy ra thuật toán cho ta đường đi ngắn nhất từ s đến mọi đỉnh của đồ thị .Kết thúc mỗi bước lặp nhãn tạm thời d(v)cho ta đoọdài của đường đi ngắn nhất từ s đến v chỉ qua những đỉnh nằm hoàn toàn trong tập S1. S2 là tập các đỉnh có nhãn tạm thời ở bước lặp đang xét.Thuật toán cần phải thực hiện n-1 bước lặp .Giả sử rằng ở một bước lặp nào đó các nhãn cố định cho ta độ dài các đường đi ngắn nhất từ s đến các đinh có nhãn cố định. Khi đã tìm được độ dài đường đi ngắn nhất d[v] thì đưòng đi này có thể tìm dựa vào nhãn Trước[v]. Thí dụ 1: Tìm đường đi ngắn nhất từ đỉnh 1 đến các đỉnh còn lại của đồ thị ở hình sau: (7) 3 2 6 (5) (1) (1) (2) (1) (1) (4) 1 (2) 4 (3) 5 . vậy thời gian tính toán của thuật toán là cỡ O(n2). Bất đẳng thức này là mâu thuẫn với cách xác định đỉnh u* là đỉnh có nhãn tạm thời nhỏ nhất. và vì thế d[u*] là độ dài của nó.Giả sử rằn đường di ngắn nhất từ ú đến u* không nằm tron trong tập S1. Kí hiệu S1 là tập các đỉnh có nhãn cố định. Bây giờ sẽ đánh giá số phép toán cần thực hiện theo thuật toán. để gán nhãn lại cũng cần thực hiện một số lượng phép toán cũng là O(n) . Vậy đường đin ngắn nhất từ s đến u* phải nằm trọn trong tập S1. Ở mỗi bước lặp để tìm ra điểm u cần thực hiện O(n) phép toán . Định lý được chứng minh. Trước tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại của đồ thị.Chứng minh.Gọi z  S2 là đỉnh đầu tiên như vậy trên đường đi này.ta sẽ chứng minh rằng ở lần lặp tiếp theo nếu đỉnh u* thu được nhãn cố định thì d(u*) chính là dọ dài đường đi ngắn nhất từ s đén u*.L < d(u*).

4 6. 1* - Đỉnh 3  . 2 4. 2 8. Bước lặp Khởi tạo 1 2 3 4 5 Đỉnh 1 0. 3 * - Bảng kết quả tính toán theo thuật toán Dijkstra Nếu chỉ cần tìm đường đi ngắn nhất từ s đến một đỉnh t nào đó thì ta có thể kết thúc thuật toán khi trở thành có nhãn cố định. Bây giờ ta xét trường hợp riêng thứ hai của bài toán tìm đường đi ngắn nhất. 1 7. T hí dụ 3. Trước hết ta chứng minh định lý sau Định lý 2.1 . Giả sử G là đồ thị không có chu trình. mà để giải nó có thể xây dựng thuật toán với độ phức tạp tính toán O(n2).Đồ thị không có chu trình .4 Đường đi trong đồ thị không có chu trình.Qui ước viết thành 2 phần của nhãn theo thứ tự : d[v]. trong đó i<j . 2 5. Truoc[v]. nhãn của nó không biến đổi ở các bước tiếp theo. 1 - Đỉnh 2 1.1 3. vì thế ta đánh dấu. 4 * - Đỉnh 4  . 4 7. 7 (3) 8 (5) (1) t=9 (1) s=1 (2) (1) 4 (5) (7) 5 (4) 6 (10) (5) 2 (2) 3 Hình . 6 * Đỉnh 6  . I.v[j]). Đỉnh được đánh dấu * là đỉnh được chọn để cố định nhãn ở bước lặp đang xét . Đồ thị trong hình sau có các đỉnh được đánh số thỏa mãn điều kiện nêu trong định lý.2. 2 * - Đỉnh 5  . đó là đồ thị không có chu trình( còn trọng số trên các cung có thể là các số thực tuỳ ý ).1 6. nghĩa là mỗi cung của nó có thể biểu diễn dưới dạng (v[i].Kết quả tính toán theo thuật toán được trình bày trong bản dưới đây. Khi đó các đỉnh của nó có thể đánh số sao cho mỗi cung của đồ thị chỉ hướng từ đỉnh có chỉ số nhỏ hơn đến đỉnh có chỉ số lớn hơn .1 8.

End. Nếu có cung v3 đi vào v2. loại bỏ khỏi đồ thị những đỉnh đã được đánh số cùng các cung đi ra khỏi chúng.. thì ta chuyển sang xét v3. End. Thoạt tiên. For v  Ke(u) do Begin Vao[v]:=Vao[v] . bắt đầu từ đỉnh v1 nếu có cung đi vào nó từ v2 thì ta lại chuyển sang xét đỉnh v2. Num :=num +1. Thuật toán được xây dựng dựa trên ý tưởng rất đơn giản sau : Rõ rang trong đồ thị không có chu trình bao giờ cũng tìm được đỉnh có bán bậc vào bằng 0 ( không có cung đi vào ). Thực vậy. vì vậy ở đó ta tốn cỡ O(m) phép toán. For v  V do If Vao[v]=0 then QUEUE  v . để thực hiện viêcv loại bỏ đỉnh đã được đánh số cùng với các cung .Để chứng minh định lý ta mô tả thuật toán sau. ta thu được đồ thị mới cũng không có chu trình.. End. Do đồ thị là không có chu trình nên sau một số hữu hạn lần chuyển như vậy ta phải đi đến đỉnh không có cung đi vào . Tiếp theo mỗi lần đánh số một đỉnh.Tiếp theo. và thủ tục được lặp lại với đồ thị mới này. Procedure Numbering. Rõ ràng ta có thể đáng số chúng theo một thứ tự tuỳ ý bắt đầu từ 1. (* Đầu vào : Đồ thị có hướng G=(V.trong đó m là số cung cua đồ thị . Quá trình đó sẽ được tiếp tục cho đến khi tất cả các đinỉh của đồ thị được đánh số. cho phép tìm ra cách đánh số thỏa mãn điều kiênk định lý. *) Begin For v  V do Vao[v]:=0.v  V Đầu ra: Với mỗi đỉnh v  V chỉ số NR[u] < NR[v]. (* tinh Vao[v]=deg-(v) *) For u  V do For v  Ke(u) do Vao[v]:=Vao[v] + 1.E) với n đỉnh không chứa chu trình được cho bởi danh sách kề Ke(v). If Vao[v]=0 then QUEUE  v .1. NR[u] :=num. QUEUE:=  . Chú ý: 1) Rõ ràng trong bước khởi tạo ta phải duyệt qua tất cả các cung của đồ thị khi tính bán bậc vào của các đỉnh. Num :=0. While QUEUE   do Begin u  QUEUE. tìm các đỉnh như vậy của đồ thị .

nên khi xét đồ thị không có chu trình ta có thể giả thiết là các đỉnh của nó được đánh số sao cho mỗi cung chỉ đi từ đỉnh có chỉ số nhỏ đến đỉnh có chỉ số lớn hơn .. (* Tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh . sử dụng thuật toán Ford-Bellman n lần không phải là cách làm tốt nhất ..Rõ ràng . 2) Thuật toán có thể để kiểm tra xem đồ thị có chứa chu trình hay không? Thực vậy. Đầu ra: Khoảng cách từ v[1] đến tất cả các đỉnh còn lại được ghi trong mảng d[v[i] ]. v[2]. do mỗi cung của đồ thị phải xét qua đúng một lần.. end. chúng ta sẽ phải duyệt qua tất cả các cung này.. d [v [j ] ] + a [v [j ] ]. for j:=2 to n do d[v[j] ]:=a[v[1] ].E) trong đó V= { v[1].đi ra khỏi nó . nếu kết thúc thuật toán vẫn còn có đỉnh chưa được đánh số (num<n) thì điều đó có nghĩa là đồ thị chứa chu trình. .v[j] ]. Độ phức tạp của thuật toán là O(m). i=1.v[j])  E ta có i<j. Đồ thị được cho bởi danh sách kề Ke(v).. v )...v  V. tt được mô tả như sau Procedure Floyd.n *) Begin d[v[1] ]:=0.2. (* Tìm đường đi ngắn nhất từ đỉnh nguồn đến tất cả các đỉnh còn lại trên đồ thị không có chu trình *) Đầu vào: Đồ thị G=(V. Trong trường hợp tổng quát . Vậy độ phức tạp thuật toán la O(m). v[n] } Đối với mỗi cung (v[i]. Ở đây ta sẽ mô tả thuật toán với độ phức tạp tính toán O(n3) : thuật toán Floyd.5 Đường đi ngắn nhất giữa tất cả các cặp đỉnh Rõ ràng ta có thể giải bài toán tìm đường đi ngắn nhất giữa tất cả các căặpđỉnh của đồ thị bằng cách sử dụng n lần thuật toán mô tả ở mục trước..2. khi đó ta thu được thuật toán với độ phức tạp là O(n4) (nếu dùng tt Ford-Bellman) hoặc O(n3) đối với trường hợp trọng số không âm hoặc đồ thị không có chu trình. trong đó ta sẽ chọn s lần lượt là các đỉnh của đồ thị . Do có thuật toán đánh số trên. gọi tắt là PERT (Project Evaluation and Review Technique ) hqy CMD ( Critical path method) I. Thuật toán tìm đường đi ngắn nhất trên đồ thị không có chu trình được mô tả trong sơ đồ sau đây : Procedure Critical_Path. Các thuật toán mô tả ở trên thường được ứng dụng vào việc xây dựng nhừn phương pháp giải bài toán điều khiển việc thực hiện những dự án lớn. fo j:=2 to n do for v  Ke [v [j ] ] do d [v ]:=min ( d [v ]. Suy ra để đánh số all các đỉnh củ đồ thị chúng ta sẽ phả duyệt tất cả các cung của đồ thị một lần nữa.

2..2. cij = trọng số của cung (i.Đầu vào : Đồ thị cho bởi ma trận trọng số a[i.j] cho độ dài đường di ngắn nhất từ i đến j.1 Phân tích. p[i.j =1.. Xét đồ thị có trọng số cạnh G = (V. cij =+ ∞ nếu không có cung (i. Một mảng d[] để ghi các độ dài đường đi ngắn nhất từ s tới đỉnh i đang có .j].w).E. end.k] + d[k.. j=1. i. với hàm trọng số w:E R là ánh xạ từ tập các cạnh E đến tập số thực R. end.j]. Xuất phát d[s] =0 và d[i] =c si nếu i kề s.j).. Rõ ràng độ phức tạp của thuật toán là O(n3).0.. Dùng ma trận kề để biểu diễn đồ thị C= (cij). (* Bước lặp *) For k:=1 to n do For i:=1 to n do For j:=1 to n do If d[i. p [i.j ].. Ma trận ghi nhận đường đi p[i.j=1. trong đó p[i.j]:=i.n Đầu ra : Ma trận đường đi ngắn nhất giữa các cặp đỉnh d[i.k] + d[k. end. II.. *) Begin (* Khởi tạo *) For i:=1 to n do For j:=1 to n do Begin d[i. i.j ]:= p [k.n. .j] > d[i.j]:=a[i..2.j]:= d[i.n trong đó d[i.j).j] ghi nhận đỉnh đi trước j trong đường đi ngắn nhất từ i đến j.j].j ]...j] then Begin d[i.. Định nghĩa 1..j] i.2 Giải thuật tìm đường đi ngắn nhất giữa một cặp đỉnh. d[j] =+ ∞ nếu j không kề s. Chương II : GIẢI THUẬT_LƯU ĐỒ THUẬT TOÁN DIJKSTRA II.

. Nó xác định đường đi ngắn nhất giữa hai đỉnh cho trước. Khởi tạo. .1.vk ). kv: mang giá trị boolean xác định trạng thái được chọn của đỉnh v. Ở mỗi đỉnh v.  v  V..v) = min {( p) | p (u. Đường đi p từ đỉnh u đến đỉnh v là dãy các cạnh nối tiếp nhau bắt đầu từ đỉnh u kết thúc tại đỉnh v. Gọi (u.1 Nội dung Có rất nhiều giải thuật đã được phát triển để giải bài toán tìm đường đi ngắn nhất giữa một cặp đỉnh.. vi ) Định nghĩa 1. Đường đi ngắn nhất pmin(u. d a = 0. dv: là chiều dài đường đi mà ta tìm thấy cho đến thời điểm đang xét từ a đến v. giải thuật Dijkstra xác định 3 thông tin: kv.3. từ đỉnh a đến đỉnh b.v).v1. là tổng các trọng số của các cạnh trên đường đi: k (p) =  w(v i 1 i 1 .v) là tập tất cả đường đi từ u đến v. Ban đầu ta khởi tạo tất cả các đỉnh v chưa được chọn. dv và pv.2. Đường đi p từ u đến v được biểu diễn như sau: p=(u=v0.3.Định nghĩa 1. dv = .v1…..vk=v) Định nghĩa 1.3 Giải thuật Dijkstra. trong khuôn khổ bài viết này em chỉ xin giới thiệu giải thuật Dijkstra. Giải thuật Dijkstra là một giải thuật để giải bài toán đường đi ngắn nhất nguồn đơn trên một đồ thị có trọng số cạnh mà tất cả các trọng số đều không âm. nghĩa là: kv = false. II. II. Độ dài của đường đi p = ( v0. ký hiệu (p). Độ dài đường đi ngắn nhất từ đỉnh u đến đỉnh v được xác định bởi: d(u. v)} Định nghĩa 1. v  V \{a}.v) từ đỉnh u đến đỉnh v là đường đi có độ dài d(u.4.

Vì ở mỗi vòng lặp ta rút ra một đỉnh của V và khởi đầu V có n phần tử. vòng lặp được thực hiện đến khi v = b. dv:= .. kiểm tra Nếu du > dv + w(v. Đánh dấu đỉnh v. Chọn v  V sao cho kv = false và dv = min {dt / t V. B5 là vòng lặp chứa các bước B2  B5. Với mỗi đỉnh u kề với v mà ku = false.. II. Sau đây là các bước của giải thuật Dijkstra: B1.v  V \ {a}. B4. không tồn tại đường đi từ a đến b. *** Trường hợp sử dụng danh sách kề . Nếu v = b thì kết thúc và db là độ dài đường đi ngắn nhất từ a đến b.2 Độ phức tạp của giải thuật Dijkstra.Quay lại B2. Khởi tạo: Đặt kv:= false v  V. Khởi tạo.b}.1 đỉnh Ở B5 số đỉnh kề tối đa được khảo sát là n -1 đỉnh Do đó: f(n)  2(n-1)n < O(|V|2) Vậy độ phức tạp của giải thuật Dijkstra là O(|V|2). kv:= true. v V.. Gọi f(n) là số lần giải thuật Dijkstra khảo sát một cạnh của đồ thị G trong trường hợp xấu nhất. kt = false} Nếu dv =  thì kết thúc.pv: là đỉnh trước của đỉnh v trên đường đi ngắn nhất từ a đến b. da:=0.pv.. Khi đó ta có: f(n) < O(|V|2) Chứng minh: Cho n = |V|..3.. pv = null.v. Đường đi ngắn nhất từ a đến b có dạng {a.u) thì du:= d v + w(v. B3. B5..u) Ghi nhớ đỉnh v: pu:= v. *** Trường hợp sử dụng ma trận kề. Ngược lại nếu v  b sang B5. Ở B2 số đỉnh tối đa được khảo sát là n .. nên vòng lặp được xử lý nhiều nhất là n lần. B2.

3 Lưu đồ thuật toán Dijstra Begin n. C = (cij). a. L(v) + c(v. II.x)) L(z) End .3. z L(a) = 0 L(v) =   v  a T(i) = 1  i  n S z T Đ Chọn v  T sao cho L[v] đạt min T = T \ {v} S x  T & kề v Đ L(x) = min(L(x).Độ phức tạp của giải thuật Dijkstra là O((|V| + |E|)lg|V|).

II.3.4 Bảng dữ liệu chạy thô. Tạo ma trận như sau 6 0 4 2 0 0 0 4 2 0 0 0 0 1 5 0 0 1 0 8 10 0 5 8 0 2 6 0 10 2 0 3 0 0 6 3 0 Ta có đồ thị như sau b 5 c 4 6 a d 1 8 2 10 3 e f Bảng chạy thô V a e b c f d T bcdef bcfd cfd fd d a 0 * độ dài từ af là 15 b e c f d   4 3* * 2* *     10 8* * 12 12 12* *     14 15 * .

&t). for(int i=1.i++) for(int j=1.L[m]. for(int j=1.i<=n.T[m]. void inmatran(char *st.Chương III : CÀI ĐẶT CHƯƠNG TRÌNH Đề tài : Chương trình tìm đường đi ngắn nhất từ đỉnh S đến đỉnh T theo thuật toán Dijkstra _Sử dụng ngôn ngữ lập trình C #include<iostream. int n. f=fopen(st. } } void docfile(char *st) { FILE*f.i++) { cout<<"\n". C[i][j]=t.&n). if(f!=NULL) { fscanf(f. } } void Dijkstra(int a.DD[m].j++) { fscanf(f. int t.int C[m][m]) { cout<<"\n\n"<<st."%d".j<=n. for(int i=1."rt").int z) . } fclose(f).h> #include<stdlib.j++) cout<<C[i][j]<<"\t"."%d".i<=n.h> #include<stdio.h> #define m 50 int C[m][m].h> #include<conio.j<=n.

DD[i]=0.x++) if(T[x]==1 && C[v][x]!=0) if(L[x]> (L[v]+C[v][x])) { L[x]=L[v]+C[v][x]. T[i]=1.v++) if(T[v]==1 && L[v]!=1000) break. // thay 1 giá trị cụ thể duongdi(a.{ for(int i=1.".x<=n. docfile("d:\\ok\\dacs\\matran.z). z=DD[z].i++) { L[i]=1000. while(DD[z]!=0) { printf("%d <-. Dijkstra(a.i<=n. // thay 1 giá trị cụ thể . cout<<"\n\n\tDuong di: ". DD[x]=v. } cout<<a.dnc"). T[v]=0. for(int j=v+1. for(int x=1.z).j++) if(T[j]==1 && L[j]<L[v]) v=j. } L[a]=0.int z) { cout<<"\n\n\tDo dai duong di ngan nhat : "<<L[z]. //chú ý đường dẫn của ma trận cout<<"\n\n*** TIM minPath() BANG THUAT TOAN DIJKSTRA. while(T[z]==1) { for(int v=1. ***".v<=n. } void main() { clrscr(). } } } void duongdi(int a.j<=n.z).

......................................................................... ....................... .............................................................................................................................................................................................................................................................. tuy nhiên vẫn còn nhiều sai sót trong quá trình hoàn thành đồ án cơ sở này..................................................... ........................................................................................... ....... ....................................................................................................................................................................................................... ....................................................................... .......................... ................... hướng phát triển........................................................................................................................... ............................................................................................................................................................. ...................................................................... .................................................................................................................................... ................................. .......................................................................................................................... Tuân theo các nguyên tắc mà thầy hướng dẫn đề ra.................................................................... ...................................................................................................................................................................................................................... ..................................................................................................... .......................................................................................... ý kiến đánh giá của thầy hướng dẫn*** ....................................................... Nguyễn Tô Thành_NXB Giáo Dục ***Nhận xét...... ....................... .................................................................................................................................................................................................................................................................................................................................................... ................... thông qua môn học này giúp em nắm bắt tốt hơn về bài toán tìm đường đi ngắn nhất giữa hai đỉnh thông qua thuật toán Dijkstra......................................................... ........................................... ..................................... } *****Kết luận****** Tóm lại............................................................................................................................... ........................................................................................................................ ............................................................ ........................................... ...................................................................................................................................................................................................................................................................................................................getch()....................................................................................................................... ******Tài liệu tham khảo ***** Toán rời rạc_tác giả: Nguyễn Đức Nghĩa........ ................................................................mong thầy giúp đỡ nhiều hơn...........................................................................................

.................................................................................................. .......................................................................................................................................................... ................................................................................................. .............................................. ................................................................. .................................................................................................................................. ................................................ ........................................................................................................................................................................... ................................................................................................. ........ ...................................................................................................................................................................... ............................................................... ...................................................................................... ................... .............................................................................................................................................................. ........................................................................................... .......... ....................................................................................................................................................................................................................... .............................................................................................................................................................................. ....................................... ............................................................................................................................................................................................................................................................................................................. .......................................................................................................................................................................................................................................... ........................................................................................................................................................ .......................................................................................................................... ...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ............................................................................................................................ .............................................................................................................. ............................................................................................................... .................................................................................... ............................................................................................ ........................................................................................................................................................................................................................................................................... ............................................................................................................................................................................................................................................................................................................................................. .......... ................... ............................................................................................................................................. ............................. ...........................................................................................................................

Sign up to vote on this title
UsefulNot useful