Dijkstra算法浅析

Dijkstra算法

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无向图是特殊的有向图)中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。注意该算法要求图中不存在负权边。

Dijkstra算法的核心是什么?

个人浅见:在于它对图层层扩展层层松弛(O(n+n)的由来)逐步探寻不断地对dis表的松弛操作。而每次确定一个点到起点的最短路,重复N次后,得到了所有点到起点的最短路。(O(n*(n+n)))=(O(n^2))

他是如何做的呢?

以下图片截取自东北林业大学江露同学的课件

EG:

有如下连通图

Dijkstra算法浅析_第1张图片

以v1为起点找到所有点的最短路

第一步:

确定点v1到点v1的最短路为0,确定v1点已求出。

Dijkstra算法浅析_第2张图片

找寻下一最短路径,其中v1v2为4,v1v3为6。

取较短的v1v2。

确定点v1到点v2的最短路为4,确定v2点已求出

标v1到v2的最短路为4

Dijkstra算法浅析_第3张图片

找寻下一最短路径,其中v2v4为5,v1v3为6,v2v5为4。

故有 v1v2+v2v4=4+5=9,v1v3=6,v1v2+v2v5=4+4=8;

取较短的v1v3。

确定点v1到点v3的最短路为6,确定v3点已求出

标v1到v3的最短路为6

Dijkstra算法浅析_第4张图片


找寻下一最短路径,其中v2v4为5,v3v4为4,v2v5为4,v3v5为7。

故有 v1v2+v2v4=4+5=9,v1v3+v3v4=6+4=10,v1v2+v2v5=4+4=8,v1v3+v3v5=6+7=13;

取较短的v2v5。

确定点v1到点v5的最短路为8,确定v5点已求出

Dijkstra算法浅析_第5张图片

找寻下一最短路径,其中v2v4为5,v3v4为4,v5v6为5,v5v7为6。

故有 v1v2+v2v4=4+5=9,v1v3+v3v4=6+4=10,v1v5+v5v6=8+5=13,v1v5+v5v7=8+6=14;

取较短的v2v4。

确定点v1到点v4的最短路为9,确定v4点已求出

Dijkstra算法浅析_第6张图片

找寻下一最短路径,其中v4v6为9,v4v7为7,v5v6为5,v5v7为6。

故有 v1v4+v4v6=9+9=18,v1v4+v4v7=9+7=16,v1v5+v5v6=8+5=13,v1v5+v5v7=8+6=14;

取较短的v5v6。

确定点v1到点v6的最短路为13,确定v6点已求出

Dijkstra算法浅析_第7张图片

找寻下一最短路径,其中v4v7为7,v5v7为6,v6v7为5,v6v8为1。

故有 v1v4+v4v7=9+7=16,v1v5+v5v7=8+6=14,v1v6+v6v7=13+5=18,v1v6+v6v8=13+1=14;

取较短的v5v7和v6v8。

确定点v1到点v7的最短路为14,确定v7点已求出

确定点v1到点v8的最短路为14,确定v8点已求出

Dijkstra算法浅析_第8张图片

至此所有点的到v1点的最短路已求出。

模板如下:

void Dijkstra(int st){
    memset(conf,0,sizeof(conf));
    conf[st]=1;//标记除起点外所有点的最短路都未确定
    for(int i=1;i<=mc;i++)
        dis[i]=a[i][st];
    dis[st]=0;//起点到起点为0
    for(int i=1;i


 
  


你可能感兴趣的:(——————图论——————,>最短路<,Dijkstra)