Dijkstra求单源最短路径(图,数据结构)

来源:互联网 发布:hr工资计算软件 编辑:程序博客网 时间:2024/06/05 04:27
  1. 什么是单源最短路?
    给定图中,给定的某个点到其余各点的最短路径为单源最短路径。

  2. Dijkstra算法思路:
    1)设置一个集合S,放已找到最短路径的点。
    2)将源点并与S,初始化源点s到V-S中其余各点的“当前最短距离”。
    3)重复一下操作n-1次:从V-S中找当前最短路径对应的点,并入S,更新源点到其余点的最短距离。

  3. Dijkstra代码实现:

//final数组记录当前点是否已并入源点的集合S中//D数组是源点到当前点的“最短路径”int final[n],D[n];final[v0] = true;//给定源点并入集合S中(判断某点是否在集合中,即看对应的final数组是什么)for(int i = 0;i < G.vexnum; ++i){   //初始化final数组    if(i != v0)        final[i] = false;    //初始化源点到其余各点的距离    D[i] = G.arcs[v0][i];    //如果需要记录路径    if(D[i] < INFINITY)       Path[i] = "v0->i";}//控制重复n-1次for(int i = 0;i <G.vexnum; ++i){    int v;    //从V-S中选取当前路径最短的点    minn = INFINITY;    for(int w = 0;w < G.vexnum; ++w)    {        if(!final[w] && minn > D[w])        {            minn = D[w];            v = w;        }    }    //v就是当前最短路径对应的点,minn就是最短路径的大小    final[v] = true;//并入集合S中    for(int w = 0; w < G.vexnum; ++w)    {        if(!final[w] && D[w] > minn + G.arcs[v][w])        {            D[w] = minn + G.arcs[v][w];            Path[w] = strcat(Path[v],"->w");//更新当前源点到w的最短路(v是刚加入源点集合的点)        }    }}
  • 特定源点到特定终点的最短路的时间复杂度同Dijkstra相同,没有更好的算法。
  • Dijkstra算法是贪心算法的一种,每次都找最优的,最后的结果也是最优的。
阅读全文
0 0
原创粉丝点击