c) Kiểm nghiệm thuật toánThuật toán Kruskal:
6.6.1. Thuật toán Dijkstra
Thuật toán tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại được Dijkstra đề nghị áp dụng cho trường hợp đồ thị có hướng với trọng số không âm. Thuật toán được thực hiện trên cơ sở gán tạm thời cho các đỉnh. 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ới đỉnh đó. Các nhãn này sẽ được biến đổi (tính lại) nhờ một thủ tục lặp, mà ở mỗi bước lặp một số đỉnh sẽ có nhãn không thay đổi, nhãn đó chính là độ dài đường đi ngắn nhất từ s đến đỉnh đó. Thuật toán Dijkstra tìm đường đi ngắn nhất từ s đến tất cả các đỉnh còn lại của đồ thị được mô tả chi tiết trong Hình 5.17.
a) Biểu diễn thuật toán
Hình 5.17. Thuật toán Dijkstra
Thuật toán Dijkstra (s): //s V là một đỉnh bất kỳ của G = <V,E>
Begin
Bước 1 (Khởi tạo):
d[s]=0; //Gán nhãn của đỉnh s là 0
T = V\{s}; // T là tập đỉnh có nhãn tạm thời
for each v V do { //Sử dụng s gán nhãn cho các đỉnh còn lại
d[v] = A[s,v]; truoc[v]=s; endfor;
Bước 2 (Lặp):
while (T ) do {
Tìm đỉnh uT sao cho d[u] = min { d[z] | zT}; T= T\{u}; //cố định nhãn đỉnh u
for each v T do { //Sử dụng u, gán nhãn laị cho các đỉnh if ( d[v] > d[u] + A[u, v] ) then {
d[v] = d[u] + A[u, v]; //Gán lại nhãn cho đỉnh v; truoc[v] = u;
endif; endfor; endwhlie;
Bước 3 (Trả lại kết quả): Return (d[s], truoc[s]);
NGUYỄN DUY PHƯƠNG 215
b) Độ phức tạp thuật toán
Độ phức tạp thuật toán là O(V2), trong đó V là số đỉnh của đồ thị. Bạn đọc tự tìm hiểu và chứng minh độ phức tạp thuật toán Dijkstra trong các tài liệu liên quan.