单源最短路径通用解法—BellmanFord

问题:在可能存在负边的情况下,计算有向图中某个起点s到其它所有点的最小距离。设w[i][j]为点i到j的边的权值,G为图的邻接表表示。BellmanFord算法可以用来求s到所有点的最小距离,当图中存在负边回路时,该方法返回false,否则返回true。每个点的最小距离存于distance[v]中,parent[v]为v的前一个节点。

伪代码:

BellmanFord(G, w, s) { //initialization for every node v in G { distance[v] = infinite parent[v] = NULL; } distance[s] = 0 //在第k次循环时,distance[v]的值即为: 对于某个值X>k,考虑了s->v路径上的边数不大于X的所有情况后所得最小值。X的值为distance[u]所考虑的边数X[u]+1。 for k = 1 to |V|-1 { for every edge (u, v) in E { if (distance[v] > distance[u] + w[u][v]) { distance[v] = distance[u] + w[u][v] parent[v] = u } } } //经过了上面的步骤,distance[v]已经考虑了边数不大于|V|的所有情况。如果没有负边回路,那么distance[v]必然为最小值。因为路径中最多包含所有节点,路径边数<=|V|-1。 //如果还存在非最小值的距离,则说明图中存在负边回路。 for every edge (u, v) in E { if (distance[v] > distance[u] + w[u][v]) { return false; } } return true; } 

 

该算法的复杂度为O(VE)。

你可能感兴趣的:(算法,null,distance)