Quá trình tìm kiếm đường đi được thực hiện bằng thuật tốn Dijkstra. Sau đây là mơ tả thuật tốn Dijkstra.
Gọi đỉnh bắt đầu là s0, đỉnh kết thúc là t0. Thuật tốn sử dụng các mảng sau:
o doDai : kích thước n phần tử (với n là số đỉnh (số node) trong đồ thị). Phần tử thứ i của mảng này lưu chiều dài từđỉnh bắt đầu s0 đến đỉnh i. o daDuyet : kích thước n phần tử. Phần tử thứ i của mảng này xác định
nút thứ i đã được duyệt hay chưa. Nếu giá trị này là true thì cĩ nghĩa là
đã duyệt rồi. Nếu giá trị này là false thì cĩ nghĩa là chưa duyệt
o truoc : kích thước n phần tử. Phần tử thứ i của mảng này xác định nút trước nút thứ i là nút nào. Mảng này dùng để xác định đường đi.
Goi tập S là tập các đỉnh đĩng. Đỉnh đĩng là đỉnh mà hiện nay đã duyệt qua. Gọi tập T là tập các đỉnh mở, tức chưa xét
• Bước 1: gán S= {s0}, T = T \ {s0} u = s0;
• Bước 2: tìm đỉnh mở v cĩ sao cho doDai[v] giá trị nhỏ nhất. Nếu v trùng u thì cĩ nghĩa là đã tìm được đường đi. Khi này chuyển sang bước 4. Nếu khơng thì chuyển sang bước 3.
172
• Bước 3: cập nhật giá trị doDai, daDuyet từ đỉnh v. Xét các đỉnh kề v. Nếu doDai[v] chưa cĩ (tức nhận giá trị VO_CUC) thì cập nhật bằng doDai[u] + chieuDai[u,v].
Nếu doDai[v] cĩ rồi thì chỉ cập nhật nếu doDai[u] + chieuDai[u,v] < doDai[v].
Nếu cĩ cập nhật giá trị doDai[v] thì cần phải cập nhật lại giá trị của truoc[v] = u.
Lặp lại bước 2.
• Bước 4: Truy tìm đường đi dựa vào mảng truoc. Quy tắc truy tìm như
sau
o Bước 4.1: Gán u = t0. Đưa t0 vào danh sách đường đi.
o Bước 4.2: Với mỗi đỉnh u hiện cĩ, ta gán v = truoc[u]. Nếu v == VO_CUC thì dừng lại. Ngược lại, đưa v vào danh sách đường đi, gán u=v, rồi lặp lại bước 4.2.
173
Chương 5 TỔNG KẾT