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

Ly thuyet ve thuat toan sắp xếp topo và giải thuậ dijkstra

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 (571.38 KB, 28 trang )

VIỆN ĐÀO TẠO CHẤT LƯỢNG CAO
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO BÀI TẬP
PHÂN TÍCH THIẾT KẾ GIẢI THUẬT
Nhóm 10

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

Trần Tuấn Anh

Sinh viên

MSSV

Nguyễn Ngọc Trung

19H1120061

Đào Văn Thương

19H1120035

THÀNH PHỐ HỒ CHÍ MINH
1|Page


MỤC LỤC

PHẦN I: LỜI NÓI ĐẦU…………………………………………………….3
PHẦN II: SẮP XẾP TOPO…………………………………………………4


1.
2.
3.
4.

GIỚI THIỆU VỀ SẮP XẾP TOPO……………………………………4
MƠ TẢ VÀ PHÂN TÍCH ĐỘ PHỨC TẠP…………………………...5
CODE MẪU…………………………………………………………..11
KẾT LUẬN VÀ ĐÁNH GIÁ…………………………………………13

PHẦN III: GIẢI THUẬT DJIKSTRA…………………………………….14
1.
2.
3.
4.

GIỚI THIỆU VỀ GIẢI THUẬT DJIKSTRA…………………………14
MƠ TẢ VÀ PHÂN TÍCH ĐỘ PHỨC TẠP…………………………...15
CODE MẪU…………………………………………………………...25
KẾT LUẬN VÀ ĐÁNH GIÁ………………………………………….27

2|Page


PHẦN I: 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 hố 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 tố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.... Mục
đích ta tìm hiểu là nhằm giới thiệu các khái niệm cơ bản,các bài toán ứng dụng quan
trọng của lý thuyết đồ thị như bài toán cây khung nhỏ nhất , bài tốn tìm đường đi
ngắn nhất... và những thuật tốn để giải quyết chúng đã được trình bày chi tiết cùng
với việc phân tích và hướng dẫn cài đặt chương trình trên máy tính.

3|Page


PHẦN II: SẮP XẾP TOPO
1. GIỚI THIỆU VỀ SẮP XẾP TOPO:
- Thông thường đối với một công việc lớn bao giờ ta cũng cần phải chia nó
thành nhiều phần để thực hiện. Có những phần việc có thể thực hiện được
độc lập nhưng cũng có những phần việc chỉ thực hiện được khi một số phần
việc khác đã được làm xong.
- Sắp xếp topo (topological sorting) là một trong những bài tốn có tính ứng
dụng cao cả trong Tin học lẫn Toán học và đời sống thường ngày. Đây là quá
trình sắp xếp một dãy các phần tử sao cho thứ tự mới vẫn đảm bảo được thứ
tự cục bộ (một cách nơm na có nghĩa là thứ tự được xác định đối với một vài
cặp phần tử chứ không phải là tất cả các phần tử) vốn có của chúng. Nhờ sắp
xếp topo mà ta có thể tính được thời gian tối thiểu để thực hiện một chuỗi
các công việc.


- Ý tưởng sắp xếp topo là dựa trên DFS (tìm kiếm theo độ sâu). Điều kiện để
thực hiện topological sorting đó là DAG (đồ thị khơng có chu trình). Thực
tế, thơng qua việc sắp xếp, ta có thể kiểm tra xem đồ thị đó có chứa chu trình
hay khơng. Một đồ thị khơng có chu trình sẽ có ít nhất 1 sắp xếp topo.

- VD: Trong một số trường ĐH ở VN hiện nay, có những học phần gọi là học
phần tiên quyết mà sinh viên buộc phải hoàn thành trước khi học các học
phần khác. Nếu học phần v là học phần tiên quyết đối với học phần w, kí
hiệu là utrước”). Sắp xếp topo ở đây cónghĩa là đưa ra thứ tự học các học phần sao
cho mọi học phần phải được học sau các học phần tiên quyết của nó.

4|Page


PHẦN II: SẮP XẾP TOPO
2. MƠ TẢ VÀ PHÂN TÍCH CÁCH THỨC HOẠT ĐỘNG:
- Công việc của sắp xếp Topo: Cho đồ thị có hướng khơng chu trình (DAG). Tìm
cách sắp xếp thứ tự các đỉnh sao cho với mọi cung từ u đến v trong đồ thị, u luôn
nằm trước v.
- Ý tưởng: Thêm ngẫu nhiên một đỉnh uu khơng có cung vào ở trạng thái hiện tại
của đồ thị vào trong mảng topo, bỏ tất cả các cung đi ra từ uu đi và lặp lại như
bước đầu cho tới khi tập đỉnh của đồ thị hiện tại rỗng.
Xem xét:


Thuật toán này được phát hiện bởi Kahn vào năm 1962.




Khi ta thêm một đỉnh uu ngẫu nhiên không có cung vào ở trạng thái hiện tại
của đồ thị vào mảng topo, tất cả các cung vào uu ở đồ thị ban đầu đều xuất
phát từ các đỉnh đứng trước uu trong mảng topo đi tới uu do bước bỏ các
cung đi ra từ một đỉnh đã được sắp xếp.



Nếu đồ thị tồn tại trạng thái không tồn tại một đỉnh khơng có cung vào mà
tập cạnh khi đó khác rỗng, hoặc số lượng đỉnh trong mảng topo
khác ∣V∣∣V∣ thì chứng tỏ đồ thị có chu trình, và khơng phải một DAG.

- Sắp xếp Topo của một đồ thị có hướng G(V,) là một cách sắp xếp các đỉnh trên
một đường thẳng sao cho với mỗi cung (u→v)∈, đỉnh u nằm bên trái đỉnh v trên
đường thẳng đó.Từ định nghĩa của săp xếp Topo ta có thể dễ dàng thấy rằng
nếu G(V,) có một sắp xếp Topo thì G(V,) khơng thể có một chu trình có hướng.
Hay nói cách khác, G(V,) là một DAG. Ngược lại, cho một DAG G(V,), ln tồn
tại một sắp xếp Topo cho G(V,).
*Chú thích: + V là tập các đỉnh hoặc các nút.
+ E là tập các cặp chứa các đỉnh phân biệt, được gọi là cạnh.

5|Page


VD 1: Sắp xếp thứ tự topo đồ thị sau:
-Chọn A làm stack và thực hiện A (1)

-Xóa A ra khỏi đồ thị (2)
-Chọn B làm stack và thực hiện B (3)


-Xóa B ra khỏi đồ thị (4)
-Chọn C làm stack và thực hiện C (5)

- Xóa C ra khỏi đồ thị (6)
- Chọn D làm stack và thực hiện D (7)

- Xóa D ra khỏi đồ thị (8)
- Chọn E làm stack và thực hiện E (9)
- Kiểm tra và hoàn thành nhiệm vụ (10)
6|Page


 Độ phức tạp của đồ thị trên là O(10)
 Kết luận: Độ phức tạp của thuật toán sắp xếp topo có cơng thức là O(|V|+|E|)
- Đồ thị mơ phỏng:

7|Page


VD 2: Tại một nhà máy lắp ráp ô tô, cơng việc lắp ráp ơ tơ có thể được chia thành
các nhiệm vụ sau:
1.
2.
3.
4.
5.
6.
7.
8.
9.


Xây dựng khung
Lắp động cơ, linh kiện, bình xăng
Lắp phanh, bánh xe, lốp xe
Lắp đặt bảng điều kiển, sàn, ghế ngồi
Lắp đặt đường dây điện
Lắp đặt đường dẫn khí
Lắp đặt dây phanh
Gắn các tấm thân vào khung
Sơn

Nhiệm vụ
1
2
3
4
5
6
7
8
9

Nhiệm vụ tiên quyết
1
1
2
2,3
4
2,3
4,5

6,7,8

Thời gian thực hiện
7 hours
6 hours
3 hours
6 hours
3 hours
1 hours
1 hours
2 hours
3 hours

- Đồ thị mô phỏng:

8|Page


- Dựa vào đồ thị mô phỏng mà chia ra các task thứ tự thực hiện:

9|Page


- Tính tốn thời gian tối thiểu để hồn thành tồn bộ q trình

 Thời gian tối thiểu để hồn thành tồn bộ q trình là 24 tiếng.
 Độ phức tạp của đồ thị trên là O(22)

10 | P a g e



3. CODE MẪU:

11 | P a g e


Kết quả cho ra:

Đồ thị mô phỏng:

12 | P a g e


4. KẾT LUẬN VÀ ĐÁNH GIÁ:
- Sắp xếp Topo có ứng dụng cao trong đời sống. Ta có thể sử dụng thuật toán sắp
xếp Topo để tạo nên sơ đồ học phần, sơ đồ lắp ráp xe máy, thao tác nhảy lò cò,…
và biết được thời gian tối thiểu để hoàn thành chúng.
- Độ phức tạp theo trường hợp xấu nhất: Θ (| V | + | E |)
- Độ phức tạp của trường hợp trung bình : Θ (| V | + | E |)
- Độ phức tạp của trường hợp tốt nhất: Θ (| V | + | E |)
- Độ phức tạp theo không gian: Θ (| V |)
=> Thuật toán trên là DFS với một ngăn xếp phụ. Vì vậy, độ phức tạp thời gian
giống như DFS là O (V + E)

13 | P a g e


PHẦN III: GIẢI THUẬT DIJKSTRA
1. GIỚI THIỆU VỀ GIẢI THUẬT DIJKSTRA:
Trong đời sống chúng ta thường gặp những tình huống như sau : để đi từ địa

điểm A đến địa điểm B trong thành phố, có nhiều đường đi, nhiều cách đi; có lúc ta
chọn đường đi ngắn nhất ( theo nghĩa cự ly ), có lúc lại cần chọn đường đi nhanh nhất
( theo nghĩa thời gian ) và có lúc phải cân nhắc để chọn đường đi rẻ tiền nhất ( theo
nghĩa chi phí ),…
Có thể coi sơ đồ của đường đi từ A đến B trong thành phố là một đồ thị, với
đỉnh các giao lộ ( A và B coi như giao lộ ), cạnh là đoạn đường nối giữa hai giao lộ.
Trên mỗi cạnh của đồ thị này, ta gán một số dương, ứng với các độ dài của đoạn
đường, thời gian đi đoạn đường hoặc cước phí vận chuyển trên đoạn đường đó,…
Đồ thị có trọng số là đồ thị G=(V, E) mà mỗi cạnh ( hoặc cung ) e E được gán
bởi một số thực m(e), gọi là trọng số của cạnh ( hoặc cung ) e.
Trong phần này, trọng số của mỗi cạnh được xét là một số dương và còn gọi là
chiều dài của cạnh đó. Mỗi đường đi từ đỉnh u đến đỉnh v, còn chiều dài là m(u,v),
bằng tổng chiều dài các cạnh mà nó đi qua. Khoảng cách d(u,v) giữa hai đỉnh u và v là
chiều dài đường đi ngắn nhất ( theo nghĩa m(u,v) nhỏ nhất ) trong các đường đi từ u
đến v.
Có thể xem một đồ thị G bất kì là một đồ thị có trọng số mà mọi cạnh đều có
chiều dài 1. Khi đó, khoảng cách d(u,v) giữa hai đỉnh u và v là chiều dài đường đi từ u
đến v ngắn nhất, tức là đường đi qua ít cạnh nhất.

- Thuật tốn Dijkstra, mang tên của nhà khoa học máy tính người Hà Lan tên
là Edsger Dijkstra vào năm 1956 và ấn bản năm 1959, là một thuật toán giải
quyết bài toán đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng khơng
có cạnh mang trọng số khơng âm. Thuật toán thường được sử dụng trong định
tuyến với một chương trình con trong các thuật tốn đồ thị hay trong cơng nghệ Hệ
thống định vị tồn cầu (GPS).
- Thuật tốn của Dijkstra là một thuật toán Greedy (Thuật toán tham lam). Điều
này có nghĩa là chúng ta sẽ đi một con đường ngắn hơn từ đỉnh này đến đỉnh kia.
Thuật tốn hồn tất khi chúng ta truy cập tất cả các đỉnh của đồ thị.
14 | P a g e



- Thuật toán Dijkstra là một trong những thuật toán cơ bản dùng để tìm đường đi
ngắn nhất từ một điểm tới một điểm nào đó, và mở rộng ra là tìm đường đi ngắn
nhất từ 1 điểm tới mọi điểm còn lại của đồ thị, với điều kiện các trọng số của đồ thị
đó khơng âm.

2. MƠ TẢ VÀ PHÂN TÍCH CÁCH THỨC HOẠT ĐỘNG:
- Trong phần này chúng ta chỉ xét đồ thị có hướng G=(V,E) và |V|=n,|E|=m với các
cung được gán trọng số, nghĩa là , mỗi cung (u,v)∈E của nó được đặt tương ứng với
một số thực a(u,v) gọi là trọng số của nó.Chúng ta sẽ đặt a(u,v)= ∞ , nếu (u,v) E .Nếu
dãy , , ..., là một đường đi trên G, thì độ dài của nó được định nghĩa là tổng sau:

tức là , độ dài của đường đi chính là tổng các trọng số trên các cung của nó.(Chú ý
rằng nếu chúng ta gán trọng số cho tất cả các cung đều bằng 1, thì ta thu được định
nghĩa độ dài đuờng đi như là số cung của đường đi.
- Bài tố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. Đường đi như vậy sẽ gọi là đường đi ngắn

15 | P a g e


nhất từ s đến t cịn độ dài của nó sẽ kí hiệu là d(s,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 ).Nếu như khơng tồn tại đường
đi từ s đến t thì ta đặt d(s,t)= ∞ từ đó ta thấy chu trình trong đồ thị có độ dài dương,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). Mặt khác,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, bởi vì,
bằng cách đi vịng theo chu trình này một số đủ lớn lần, 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. Trong truờng hợp như

vậy, có thể đặt vấn đề tìm đường đi cơ bản ngắn nhất, tuy nhiên bài toán đặt ra sẽ trở
nên phức tạp hơn rất nhiều, bởi vì nó chứa bài tốn xét sự tồn tại đường đi Hamintơn
trong đồ thị như là một trường hợp riêng. Trước hết cần chú ý rằng nếu biết khoảng
cách từ s đến t, thì đường đi ngắn nhất từ s đến t, trong trường hợp trọng số khơng âm,
có thể tìm một cách dễ dàng.
- Để tìm đường đi , chỉ cần chú ý là đối với cặp đỉnh s,t V tuỳ ý (s ≠ t) ln tìm được
đỉnh v sao cho:
d(s,t) = d(s,v) + a(v,t)
Thực vậy đỉnh v như vậy chính là đỉnh đi trước đỉnh t trong đường đi ngắn nhất từ s
đến t.Tiếp theo ta có thể tìm được u sao cho d(s,v)=d(s,u)+a(u,v),... 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,v,u... không chứa đỉnh lặp lại
và kết thúc ở đỉnh s.Rõ ràng dãy thu được xác định đường đi ngắn nhất từ s đến t.
a) Đường đi ngắn nhất xuất phát từ một đỉnh
- Phần lớn các thuật tố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 tốn mà ta có thể mơ tả đại thể như sau: từ ma trận trọng số a[u,v],u,v∈ V,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.Mỗi khi phát hiện
d[u]+a[u,v]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.Khi đó, rõ ràng

16 | P a g e


giá trị của mỗi d[v] sẽ cho ta khoảng cách từ mỗi đỉnh s đến v. Khi thể hiện kỹ thuật
tính tốn này trên máy tính, cận trên d[v] sẽ được gọi là nhãn của đỉnh v,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. 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ị. 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 tốn tìm đường đi ngắn nhất
từ một đỉnh đến tất cả các đỉnh cịn lại. Sơ đồ tính tốn mà ta vừa mơ tả cịn chưa là
xác định, 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).Thứ tự chọn này có ảnh hưởng rất lớn đến hiệu quả thuật toán.
b) Thuật toán Dijkstra
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. 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. 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ó. Các nhãn này sẽ được biếndổi theo thủ
tục lặp, 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 .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ó.Thuật tốn được mơ tả như sau:
Mơ tả thuật tốn :
 Đầu vào :
Đồ thị có hướng G=(V,E) với n đỉnh, s∈ V là đỉnh xuất phát, a[u,v] ∈ V, ma trận
trọng số;
Giả thiết : a[u,v]≥0, u,v∈ V
 Đầu ra : khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v],v ∈ V.
Begin(*khởi tạo*)

17 | P a g e


For v∈ V. do
Begin
d[v]:=a[s, v];
Truoc [v]:=s;
End;
d[s]:=0;T:=V\{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};
T:=T\{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] then
Begin
d[v]:=d[u]+a[u,v];
truoc[v]:=u;
end;
end;
end;

Chứng minh.

18 | P a g e


- Trước tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại của đồ thị.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,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*.
- Kí hiệu S1 là tập các đỉnh có nhãn cố định, S2 là tập các đỉnh có nhãn tạm thời ở
bước lặp đang xét.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.Giả sử rằn
đường di ngắn nhất từ ú đến u* không nằm tron trong tập S1, tức là nó đi qua ít nhất
một đỉnh của tập S2.Gọi z∈ S2 là đỉnh đầu tiên như vậy trên đường đi này.Do trọng
số trên các cung là không âm , nên đoạn đường từ s đến u* có độ dài
L>0 và d(z) < d(u*) - L < d(u*).
- 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ậy đường đin ngắn nhất từ s đến u* phải nằm trọn trong tập S1, và vì thế
d[u*] là độ dài của nó.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 .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ị . Bây giờ sẽ đánh giá số phép toán cần thực
hiện theo thuật tốn. Ở mỗi bước lặp để tìm ra điểm u cần thực hiện O(n) phép 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) .Thuật toán
cần phải thực hiện n-1 bước lặp , vậy thời gian tính tốn của thuật toán là cỡ O(n2).
Định lý được chứng minh.
- 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], v∈ V.
Ví 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:

19 | P a g e


Kết quả tính tốn theo thuật tốn được trình bày trong bản dưới đây.Qui ước viết
thành 2 phần của nhãn theo thứ tự : d[v], Truoc[v]. Đỉnh được đánh dấu * là đỉnh
được chọn để cố định nhãn ở bước lặp đang xét , nhãn của nó khơng biến đổi ở các
bước tiếp theo, vì thế ta đánh dấu.

Bước lặp
Khởi tạo
1
2
3
4
5

Đỉnh 1
0, 1
-


Đỉnh 2
1, 1 *
-

Đỉnh 3
,1
6, 2
4, 4 *
-

Đỉnh 4
,1
3, 2 *
-

Đỉnh 5
,1
,1
7, 4
7, 4
6, 6*

Đỉnh 6
,1
8, 2
8, 2
5, 3 *
-


Bảng kết quả tính tốn theo thuật tố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 tốn khi trở thành có nhãn cố định.

c) Phân tích.
Dùng ma trận kề để biểu diễn đồ thị C= (cij), cij = trọng số của cung (i,j), cij =+ ∞
nếu khơng có cung (i,j). Một mảng d[] để ghi các độ dài đường đi ngắn nhất từ s
20 | P a g e


tới đỉnh i đang có . Xuất phát d[s] =0 và d[i] =c si nếu i kề s, d[j] =+ ∞ nếu j khơng
kề s.
d) Giải thuật Dijkstra.
- Có rất nhiều giải thuật đã được phát triển để giải bài tốn tìm đường đi ngắn nhất
giữa một cặp đỉnh, 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. Nó
xác định đường đi ngắn nhất giữa hai đỉnh cho trước, từ đỉnh a đến đỉnh b.
Ở mỗi đỉnh v, giải thuật Dijkstra xác định 3 thông tin: kv, dv

và pv.

kv: mang giá trị boolean xác định trạng thái được chọn của đỉnh v.
Ban đầu ta khởi tạo tất cả các đỉnh v chưa được chọn, nghĩa là: kv =
false, ∀ v ∈ V.
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.
Khởi tạo, dv = ∞, ∀v ∈ V \{a}, da = 0.

pv: là đỉnh trước của đỉnh v trên đường đi ngắn nhất từ a
đến b.
Đường đi ngắn nhất từ a đến b có dạng {a,...,pv,v,...,b}. Khởi tạo, pv = null, ∀v∈ V.
Sau đây là các bước của giải thuật Dijkstra:
B1. Khởi tạo: Đặt := false ∀v ∈ V; := ∞,∀v ∈ V \ {a}, da:=0.
B2. Chọn v ∈ V sao cho = false và = min {dt / t∈ V, kt = false}
Nếu = ∞ thì kết thúc, khơng tồn tại đường đi từ a đến b.
B3. Đánh dấu đỉnh v, := true.

21 | P a g e


B4. Nếu v = b thì kết thúc và db là độ dài đường đi ngắn nhất từ a đến b.
Ngược lại nếu v ≠ b sang B5.
B5. Với mỗi đỉnh u kề với v mà ku = false, kiểm tra
Nếu > + w(v,u) thì:= + w(v,u)
Ghi nhớ đỉnh v: := v.Quay lại B2.

e) Độ phức tạp của giải thuật Dijkstra.
*** Trường hợp sử dụng ma trận kề.
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. Khi đó ta có:
f(n) < O()
Chứng minh: Cho n = |V|, B5 là vòng lặp chứa các bước B2 → B5, vòng lặp
được thực hiện đến khi v = b.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ử, nên vịng lặp được xử lý nhiều nhất là n lần.
Ở B2 số đỉnh tối đa được khảo sát là n - 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ậy độ phức tạp của giải thuật Dijkstra là O().
*** Trường hợp sử dụng danh sách kề
Độ phức tạp của giải thuật Dijkstra là O((|V| + |E|)lg|V|).
f) Lưu đồ thuật toán Dijstra

22 | P a g e


g) Bảng dữ liệu chạy thô.
Tạo ma trận như sau
6
042000
401500

23 | P a g e


2 1 0 8 10 0
058026
0 0 10 2 0 3
000630
Ta có đồ thị như sau

Bảng chạy thơ
V

T


a
bcdef
e
bcfd
b
cfd
c
fd
f
d
d
độ dài từ a f là 15

a
0
*

b

e

4
3*

2*
*

c

f


10
8*
*

12
12
12*

d

14
15
*

24 | P a g e


3. CODE MẪU

25 | P a g e


×