单源最短路问题1(Bellman-Ford算法)

单源最短路问题是固定一个起点,求它到其他所有点的最短路问题。

记从起点 s 出发到顶点 i 的最短距离为d[ i ]。则下述等式成立。

d[ i ] = min{ d [ j ] + (从 j 到 i 的边的权值) | e = ( j ,i ) ∈ E }

如果给定的图是一个DAG(有向无环图),就可以按拓扑序给顶点编号,并利用这条递推关系式计算出d。在这种情况下,记当前到顶点 i 的最短路长度为d[ i ],并设初值d[ s ] = 0, d[ i ] = INF(足够大的常数),再不断使用这条递推关系式更新d的值。只要图中不存在负圈,这样的更新操作就是有限的。结束之后的d就是所求的最短距离。

代码:

struct edge{
    int from;
    int to;
    int cost;
};

edge es[MAX_E];
int d[MAX_V];
int V, E;

void shortest_path(int s) {
    for(int i = 02; i < V; i++) {
        d[i] = INF;
    }
    d[s] = 0;
    while(true) {
        bool update = false;
        for(int i = 0; i < E; i++) {
            edge e = es[i];
            if(d[e.from] != INF && d[e.to] > d[e.from] + e.cost) {
                d[e.to] = d[e.from] + e.cost;
                update = true;
            }
        }
        if(!update) 
            break;
    }
}

results matching ""

    No results matching ""