Tôi đã nghiên cứu ba và tôi nói rằng những suy luận của tôi từ họ bên dưới. Ai đó có thể cho tôi biết nếu tôi đã hiểu họ đủ chính xác hay không? Cảm ơn bạn.
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 trường hợp như thế này
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ỳ âm
(đây là điều quan trọng nhất. Ý tôi là, đây là điều tôi ít chắc chắn nhất :)
3.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?
Nếu bạn cần phải có một cái nhìn, các thuật toán tương ứng là (Wikipedia lịch sự):
Bellman-Ford:
procedure BellmanFord(list vertices, list edges, vertex source)
// This implementation takes in a graph, represented as lists of vertices
// and edges, and modifies the vertices so that their distance and
// predecessor attributes store the shortest paths.
// Step 1: initialize graph
for each vertex v in vertices:
if v is source then v.distance := 0
else v.distance := infinity
v.predecessor := null
// Step 2: relax edges repeatedly
for i from 1 to size(vertices)-1:
for each edge uv in edges: // uv is the edge from u to v
u := uv.source
v := uv.destination
if u.distance + uv.weight < v.distance:
v.distance := u.distance + uv.weight
v.predecessor := u
// Step 3: check for negative-weight cycles
for each edge uv in edges:
u := uv.source
v := uv.destination
if u.distance + uv.weight < v.distance:
error "Graph contains a negative-weight cycle"
Dijkstra:
1 function Dijkstra(Graph, source):
2 for each vertex v in Graph: // Initializations
3 dist[v] := infinity ; // Unknown distance function from
4 // source to v
5 previous[v] := undefined ; // Previous node in optimal path
6 // from source
7
8 dist[source] := 0 ; // Distance from source to source
9 Q := the set of all nodes in Graph ; // All nodes in the graph are
10 // unoptimized - thus are in Q
11 while Q is not empty: // The main loop
12 u := vertex in Q with smallest distance in dist[] ; // Start node in first case
13 if dist[u] = infinity:
14 break ; // all remaining vertices are
15 // inaccessible from source
16
17 remove u from Q ;
18 for each neighbor v of u: // where v has not yet been
19 removed from Q.
20 alt := dist[u] + dist_between(u, v) ;
21 if alt < dist[v]: // Relax (u,v,a)
22 dist[v] := alt ;
23 previous[v] := u ;
24 decrease-key v in Q; // Reorder v in the Queue
25 return dist;
Floyd-Warshall:
1 /* Assume a function edgeCost(i,j) which returns the cost of the edge from i to j
2 (infinity if there is none).
3 Also assume that n is the number of vertices and edgeCost(i,i) = 0
4 */
5
6 int path[][];
7 /* A 2-dimensional matrix. At each step in the algorithm, path[i][j] is the shortest path
8 from i to j using intermediate vertices (1..k−1). Each path[i][j] is initialized to
9 edgeCost(i,j).
10 */
11
12 procedure FloydWarshall ()
13 for k := 1 to n
14 for i := 1 to n
15 for j := 1 to n
16 path[i][j] = min ( path[i][j], path[i][k]+path[k][j] );