理解最短路径-dijkstra算法

Posted 大道算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解最短路径-dijkstra算法相关的知识,希望对你有一定的参考价值。

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++)

int dijkstra(int n)

{
     //初始化v[0]到v[i]的距离
     for(int i=1;i<=n;i++)
         dis[i] = w[0][i];                                      
     vis[0]=1;//标记v[0]点
    for(int i = 1; i <= n; i++)
    {
        //查找最近点
        int min = INF,k = 0;
        for(int j = 0; j <= n; j++)
            if(!vis[w] && dis[j] < min)
                min = dis[w],k = j;
        vis[k] = 1;//标记查找到的最近点
       //判断是直接v[0]连接v[j]短,还是经过v[k]连接v[j]更短
       for(int j = 1; j <= n; j++)
           if(!vis[j] && min+w[k][j] < dis[j])
                d[j] = min+w[k][j];
    }
    return dis[j];
}


以上是关于理解最短路径-dijkstra算法的主要内容,如果未能解决你的问题,请参考以下文章

理解最短路径-dijkstra算法

最短路径之Dijkstra算法和Floyd-Warshall算法

最短路径(Dijkstra算法)

最短路径(Dijkstra算法)

最短路径 深入浅出Dijkstra算法(一)

图-最短路径-Dijkstra及其变种