Relax Function on Shortest Path Algorithm
In a Weighted Directed Graph G (with positive weights), with n vertex and m edges, we want to calculate the shortest path from vertex 1 to other vertexes. we use 1-dimensional array D[1..n] , and D[1]=0 and others filled with +infinity . for updating the array we just permit to use Realx(u, v)
if D[v] > D[u] + W(u, v) then D(v):=D(u)+W(u,v)
in which W(u, v) is the weight of u-->v edge. how many time we must call the Relax function to ensure that for each vertex u , D[u] be equals to length of shortest path from vertex 1 to u .
Solution: i think this is Bellman-Ford and m*n times we must call.
In Dijkstra and Bellman-Ford and others, we have Relax function. How do we detect which of them?
Cited from CLRS Book:
The algorithms in this chapter differ in how many times they relax each edge and the order in which they relax edges. Dijkstra's algorithm and the shortest-paths algorithm for directed acyclic graphs relax each edge exactly once. The Bellman-Ford algorithm relaxes each edge |V|-1 times.
For Bellman-Ford and Dijkstra algorithm, we will use same relax function, but the main different is, how many times the relax function is being called, in each algorithm.
For Bellman-Ford:
for i from 1 to size(vertices)-1:
for each edge (u, v) with weight w in edges:
relax(u,v)
So, relax function will be called exactly n - 1 times for each edges.
For Dijkstra:
while Q is not empty:
u ← vertex in Q with min dist[u] // Source node in first case
remove u from Q
for each edge(u,v) of u: // where v is still in Q.
relax(u,v)
end for
end while
In this case, relax function will be called once for each edge, when its starting vertex is processed.
Summary: Bellman-Ford's algorithm, the number of relax function call is m*n , and Dijkstra's algorithm, the number of call is m , with m is number of edges, and n is number of vertices.
Note : code is taken and modified from Wikipedia to bring you clearer view of using relax function
We should iterate over each edge n - 1 times:
for step <- 0 ... n - 1:
for edge <- edges
relax(edge)
It is necessary: imagine a chain with n vertices. We need to make exactly n - 1 steps to reach the last.
It is sufficient: there no cycle in an optimal path, and the longest simple path contains at most n - 1 edges.
So the answer is (n - 1) * m is want to simply iterate over the distance array and make changes(yes, it is Ford-Bellman's algorithm).
However, if another algorithm is used(for instance, Dijkstra's), the number of calls to the relax function is less(namely, m ).
So it depends on details of the algorithm we are using.
链接地址: http://www.djcxy.com/p/35302.html上一篇: 如何为未加权图做最短路径算法?
下一篇: 放松函数最短路径算法
