• 理解最短路径——迪杰斯特拉(dijkstra)算法


      原址地址:http://ibupu.link/?id=29

    1.       迪杰斯特拉算法简介

     迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科学家狄克斯特拉于1959年提出,用来求得从起始点到其他所有点最短路径。该算法采用了贪心的思想,每次都查找与该点距离最近的点,也因为这样,它不能用来解决存在负权边的图。解决的问题大多是这样的:有一个无向图G(V,E),边E[i]的权值为W[i],找出V[0]到V[i]的最短路径。

    3.     迪杰斯特拉算法的原理

    迪杰斯特拉算法实现动画①首先,引入一个辅助向量D,它的每个分量D[i]表示当前所找到的 Dijkstra算法运行动画过程 Dijkstra算法运行动画过程 从起始点 (即源点 )到其它每个顶点 的长度。例如,D[3] = 2表示从起始点到顶点3的路径相对最小长度为2。这里强调相对就是说在算法执行过程中D的值是在不断逼近最终结果但在过程中不一定就等于长度。

    ②D的初始状态为:若从v 到v[i]有弧(即从v到v[i]存在连接边),则D[i]为弧上的权值(即为从v到v[i]的边的权值);否则置D[i]为∞。显然,长度为 D[j]= Min{ D |v[i]∈V } 的路径就是从v出发到顶点v[j]的长度最短的一条路径,此路径为(v,v[j])。

    ③那么,下一条长度次短的是哪一条呢?也就是找到从源点v到下一个顶点的最短路径长度所对应的顶点,且这条最短路径长度仅次于从源点v到顶点v[j]的最短路径长度。 假设该次短路径的终点是v[k],则可想而知,这条路径要么是(v,v[k]),或者是(v,v[j],v[k])。它的长度或者是从v到v[k]的弧上的权值,或者是D[j]加上从v[j]到v[k]的弧上的权值。

    ④一般情况下,假设S为已求得的从源点v出发的最短路径长度的顶点的集合,则可证明:下一条次最短路径(设其终点为x)要么是弧(v,x),或者是从源点v出发的中间只经过S中的顶点而最后到达顶点 的路径。 因此,下一条长度次短的的最短路径长度必是D[j]= Min{ D[i] |v[i]∈V-S },其中D 要么是弧( v,v[i])上的权值,或者是D[i]( v[k]∈S)和弧(v[k] ,v[i] )上的权值之和。

    3.     迪杰斯特拉算法的实现过程

    迪杰斯特拉算法流程图①先取一点v[0]作为起始点,初始化dis[i],d[i]的值为v[0]到其余点v[i]的距离w[0][i],如果直接相邻初始化为权值,否则初始化为无限大;

    ②将v[0]标记,vis[0] = 1(vis一开始初始化为0);

    ③找寻与v[0]相邻的最近点v[k],将v[k]点记录下来,v[k]与v[0]的距离记为min;

    ④把v[k]标记,vis[k]=1;

    ⑤查询并比较,让dis[j]与min+w[k][j]进行比较,判断是直接v[0]连接v[j]短,还是经过v[k]连接v[j]更短,即dis[j]=MIN(dis[j],min+w[k][j]);

    ⑥继续重复步骤③与步骤⑤,知道找出所有点为止。

     4.    迪杰斯特拉的实现代码(C/C++)

     1 int dijkstra(int n)
     2 {
     3     //初始化v[0]到v[i]的距离
     4     for(int i=1;i<=n;i++)
     5         dis[i] = w[0][i];                                       
     6     vis[0]=1;//标记v[0]点
     7     for(int i = 1; i <= n; i++)
     8     {
     9         //查找最近点
    10         int min = INF,k = 0;
    11         for(int j = 0; j <= n; j++)
    12             if(!vis[w] && dis[j] < min)
    13                 min = dis[w],k = j;
    14         vis[k] = 1;//标记查找到的最近点
    15         //判断是直接v[0]连接v[j]短,还是经过v[k]连接v[j]更短
    16         for(int j = 1; j <= n; j++)
    17             if(!vis[j] && min+w[k][j] < dis[j])
    18                 d[j] = min+w[k][j];
    19     }
    20     return dis[j];
    21 }

     原址地址:http://ibupu.link/?id=29

  • 相关阅读:
    算法视频库下载常用网址(转载)
    Python study 1
    $X-Real-Ip和$X-Forwarded-For的区别
    python装饰器
    python迭代器和生成器
    python函数动态参数详解
    python常用模块
    python 正则re模块
    pycharm5新版注册
    老男孩python自动化运维作业2
  • 原文地址:https://www.cnblogs.com/iambupu/p/5713952.html
Copyright © 2020-2023  润新知