Thuật toán của Dijkstra chỉ được sử dụng khi bạn có một nguồn duy nhất và bạn muốn biết đường dẫn nhỏ nhất từ nút này sang nút khác, nhưng không thành công [trong biểu đồ có cạnh âm]
Thuật toán Dijkstra là một ví dụ về một con đường ngắn nhất là một nguồn đơn hoặc SSSP thuật toán. Mỗi thuật toán SSSP tính khoảng cách đường đi ngắn nhất từ một nút nguồn được chọn đến mọi nút khác trong biểu đồ. Hơn nữa, nó tính toán một biểu diễn nhỏ gọn của tất cả các đường dẫn ngắn nhất từ s đến mọi nút khác, dưới dạng một cây gốc. Trong mã Wikipedia, là cha mẹ của v trong cây này.SSprevious[v]
v
Hành vi của thuật toán Dijkstra trong các biểu đồ có các cạnh âm phụ thuộc vào biến thể chính xác đang được thảo luận. Một số biến thể của thuật toán, như biến thể trong Wikipedia, luôn chạy nhanh nhưng không tính toán chính xác các đường dẫn ngắn nhất khi có các cạnh âm. Các biến thể khác, như một trong các ghi chú bài giảng này luôn tính toán các đường đi ngắn nhất một cách chính xác (trừ khi có một chu kỳ âm có thể tiếp cận được từ nguồn) nhưng có thể yêu cầu thời gian theo cấp số nhân trong trường hợp xấu nhất nếu có các cạnh âm.
Thuật toán của Floyd-Warshall được sử dụng khi bất kỳ nút nào trong số tất cả các nút có thể là nguồn, vì vậy bạn muốn khoảng cách ngắn nhất để đến bất kỳ nút đích nào từ bất kỳ nút nguồn nào. Điều này chỉ thất bại khi có chu kỳ tiêu cực.
Đúng rồi. Floyd-Warshall là một ví dụ về thuật toán đường dẫn ngắn nhất của tất cả các cặp , có nghĩa là nó tính toán các đường dẫn ngắn nhất giữa mỗi cặp nút. Một ví dụ khác là "đối với mỗi nút v, hãy chạy Dijkstra với v là nút nguồn". Có một vài người khác.
Bellman-Ford được sử dụng như Dijkstra, khi chỉ có một nguồn. Điều này có thể xử lý các trọng số âm và hoạt động của nó giống như của Floyd-Warshall ngoại trừ một nguồn, phải không?
Bellman-Ford là một ví dụ khác về thuật toán đường dẫn ngắn nhất một nguồn , như Dijkstra. Bellman-Ford và Floyd-Warshall là ví dụ tương tự , ví dụ, cả hai đều là thuật toán lập trình động, nhưng Floyd-Warshall không phải là thuật toán giống như "đối với mỗi nút v, hãy chạy Bellman-Ford với v là nút nguồn". Cụ thể, Floyd-Warshall chạy trong thời gian , trong khi lặp lại-Bellman-Ford chạy trong thời gian O ( V 2 E ) ( O ( V E ) cho mỗi đỉnh nguồn).Ô ( V3)Ô ( V2E)Ô ( VE)
Để biết thêm chi tiết, tham khảo sách giáo khoa thuật toán yêu thích của bạn. (Bạn có sách giáo khoa thuật toán yêu thích không?)