求解图的最短路径(Dijkstra+Floyd)

1. Dijkstra迪杰斯特拉

迪杰斯特拉算法,用于给定起始点,求该点到其余点的最短路径的图问题。

算法思想为:

每求到一个点的最短路径,就要“更新”该点对应出度点的“当前最短路径”。

更新的过程中,需要将x点(刚求得最短路径的点)的最短路径加上x点到y点(需要“更新”的点)边的权重,与原本y点的“当前最短路径”比较。

若前者小,则取后者而代之,变为y新的“当前最短路径”。若前者大,则y点的“当前最短路径”保持不变。

更新”结束后,遍历所有未求得最短路径点的“当前最短路径”,其中的最小值即为该点真正的最短路径

示例及图解:

求解图的最短路径(Dijkstra+Floyd)_第1张图片
D1.png
求解图的最短路径(Dijkstra+Floyd)_第2张图片
D2.png
求解图的最短路径(Dijkstra+Floyd)_第3张图片
D3.png
求解图的最短路径(Dijkstra+Floyd)_第4张图片
D4.png
求解图的最短路径(Dijkstra+Floyd)_第5张图片
D5.png

2. Floyd佛洛依德

弗洛伊德是求解图中任意两点间最短路径的算法。

算法时间复杂度与用迪杰斯特拉求解相同,但是弗洛伊德算法十分简单,核心代码只需三行。

算法思想为:

1)任意两点间的初始最短距离,为以两点为端点的边的权重。

2)遍历所有点(k),若任意两点(i和j),满足(i,k)最短距离 + (k,j)最短距离 < (i,j)最短距离,则取(i,j)最短距离而代之。

代码如下:

for(k=1;k<=n;k++)  
    for(i=1;i<=n;i++)  
        for(j=1;j<=n;j++)  
            if(e[i][j]>e[i][k]+e[k][j])  
                e[i][j]=e[i][k]+e[k][j];  

你可能感兴趣的:(求解图的最短路径(Dijkstra+Floyd))