Thuật toán Dijkstra

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2016): Phần 2 (Trang 90 - 91)

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 uT sao cho d[u] = min { d[z] | zT}; 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.

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2016): Phần 2 (Trang 90 - 91)

Tải bản đầy đủ (PDF)

(101 trang)