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

  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算法是贪心算法的一种,每次都找最优的,最后的结果也是最优的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值