最短路

最短路



一、最短路相关概念

在这里插入图片描述

二、Floyd

我们定义一个数组 dis[k][x][y] ,表示只允许经过结点 V1 到 Vk ,结点 x 到结点 y 的最短路长度。

for (k = 1; k <= n; k++) {
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
    }
  }
}

三、Dijkstra

只适用于非负权图,但是时间复杂度非常优秀。也是用来求单源最短路径的算法。
主要思想是,将结点分成两个集合:已确定最短路长度的,未确定的。

一开始第一个集合里只有 S (源点)。

然后重复这些操作:
1.对那些刚刚被加入第一个集合的结点的所有出边执行松弛操作。
2.从第二个集合中,选取一个最短路长度最小的结点,移到第一个集合中。

对那些刚刚被加入第一个集合的结点的所有出边执行松弛操作。
从第二个集合中,选取一个最短路长度最小的结点,移到第一个集合中。
直到第二个集合为空,算法结束。

四、Bellman-Ford

一种基于松弛(relax)操作的最短路算法。
支持负权。
能找到某个结点出发到所有结点的最短路,或者报告某些最短路不存在。
在国内,你可能听说过的“SPFA”,就是 Bellman-Ford 算法的一种实现。(优化)

posted @ 2021-01-30 19:44  Star_tears  阅读(42)  评论(0)    收藏  举报