b) Mô tả thuật toán
6.1. Phát biểu bài toán
Xét đồ thị G=<V, E>; trong đó | V| = n, | E | = m. Với mỗi cạnh (u, v)E, ta đặt tƣơng ứng với nó một số thực A[u][v] đƣợc gọi là trọng số của cạnh. Ta sẽ đặt A[u,v]=
nếu (u, v)E. Nếu dãy v0, v1, . . . , vk là một đƣờng đi trên G thì 1 [ 1, ]
p
i Avi vi đƣợc gọi là độ dài của đƣờng đi.
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 sau: tìm đƣờng đi ngắn nhất từ một đỉnh xuất phát sV (đỉnh nguồn) đến đỉnh cuối tV (đỉnh đích). Đƣờng đi nhƣ vậy đƣợc gọi là đƣờng đi ngắn nhất từ s đến t,
độ dài của đƣờng đi d(s,t) đƣợc gọi là khoảng cách ngắn nhất từ s đến t (trong trƣờng hợp tổng quát d(s,t) có thể âm). Nếu nhƣ không tồn tại đƣờng đi từ s đến t thì độ dài đƣờng đi
d(s,t)=. Dƣới đây là một số thể hiện cụ thể của bài toán.
Trƣờng hợp 1. Nếu s cố định và t thay đổi, khi đó bài toán đƣợc phát biểu dƣới dạng tìm đƣờng đi ngắn nhất từ s đến tất cả các đỉnh còn lại trên đồ thị. Đối với đồ thị có trọng số không âm, bài toán luôn có lời giải bằng thuật toán Dijkstra. Đối với đồ thị có trọng số âm nhƣng không tồn tại chu trình âm, bài toán có lời giải bằng thuật toán Bellman-Ford. Trong trƣờng hợp đồ thị có chu trình âm, bài toán không có lời giải.
Trƣờng hợp 2. Nếu s thay đổi và t cũng thay đổi, khi đó bài toán đƣợc phát biểu dƣới dạng tìm đƣờng đi ngắn nhất giữa tất cả các cặp đỉnh của đồ thị. Bài toán luôn có lời giải trên đồ thị không có chu trình âm. Đối với đồ thị có trọng số không âm, bài toán đƣợc giải quyết bằng cách thực hiện lặp lại n lần thuật toán Dijkstra. Đối với đồ thị không có chu trình âm, bài toán có thể giải quyết bằng thuật toán Floyed.
Các thuật toán cụ thể giải quyết bài toán tìm đƣờng đi ngắn nhất đƣợc thực hiện nhƣ dƣới đây.