最短路径——Dijkstra算法 & Floyd算法

朴灿烈づ我的快乐病毒、 2023-02-28 04:08 125阅读 0赞

从单个点到其余各点之间的最短路径——Dijkstra算法

各点之间的最短路径——Floyd算法


从单个点到其余各点间的最短路径**——Dijkstra**算法

基本思想

  1. 按照最短路径长度不减的次序求各顶点的解。
  2. 若已知道路v0v1v2v3vn-1vnv0vn最近的路,
  3. 则途经的某顶点vi也为v0vi最短的路。

方法如下:

(其中:path[v]和dist[v]表示从v0到v的最短路径及其长度)

(1)对v0以外的各顶点vi,若存在,则将其作为v0到vi的(暂时的)最短路径存放到path[v]中,将其权值作为对应的路径长度存放到dist[v]中。

(2)从未解顶点中选择一个dist值最小的顶点v,则当前的path[v]和dist[v]就是顶点v的最终解。

(3)由于某些顶点经过v可能会使得从v0到该顶点的路径更近一些,因此,应修改这些顶点的路径及其长度的值。

(4)重复(2)(3),直到所有顶点求解完毕。

例子:求下图中顶点1到其余各顶点的最短路径。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70

(1)初始化:1到v,若有边,则path[v]=边;dist[i]=边的值

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 1

(2)选出dist[i]为最小值,则path[i]为1到i的最短路径

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 2

(3)修改经过i更近的路径

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 3

(4)重复(2)(3)……

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 5

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 6

图采用邻接矩阵或邻接表来存储,算法复杂度均为O (n^2 ) 。 


各点间的最短路径**—— Floyd**算法

基本思想

 通过矩阵序列实现A(0),A(1),…,A(n),其中A(k)中的元素A(k) [i,j]代表:顶点i到顶点j的当中间经过的顶点号不大于k时的最短路径长度。

如何求解各矩阵?

Floyd**算法采用的是由**A(k-1) 矩阵求A(k)的方法来实现的。

由A(k-1) 矩阵求A(k)的方法

  1. 可通过求得矩阵中的各元素A(k)ij来实现求解
  2. A(k)ij的求解:可**由**A(k-1) 矩阵中的相关元素来求得:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 7

分两种情况讨论:

经过顶点k时,路径更短,

  1. A (k-1) ik \+ A (k-1) kj < A (k-1) ij ,
  2. A (k) ij= A (k-1) ik \+ A (k-1) kj

经过顶点k时,路径更长,

  1. A (k-1) ik \+ A (k-1) kj >A (k-1) ij
  2. A (k) ij =A (k-1)ij

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyaWZ0ZXJfR2FsYXh5_size_16_color_FFFFFF_t_70 8

依次选择编号为1的点为中间点(如【2,3】=【2,1】+【1,3】=4+3=7)得到A^1,选择编号为2的点为中间点得到A^2,选择编号为3的点为中间点得到A^3​​​​​​​,选择编号为4的点为中间点得到A^4​​​​​​​。

算法复杂度为O(n^3) .

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读

    相关 路径Floyd算法

    Floyd算法: 1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。 2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w