Dijkstra算法实现步骤详细解析

文章目录

    • 1.声明概念
    • 2.初始化dist数组和集合T
    • 3.进入循环
      • 第一次循环
      • 第二次循环
      • 第三次循环
      • 第四次循环
      • 第五次循环
      • 第六次循环
    • 最终结果

图片来源:最短路径问题—Dijkstra算法详解

Dijkstra算法实现步骤详细解析_第1张图片

1.声明概念

  • 源点:V1
  • 最短路径的顶点的集合:T
  • 源点到各个顶点的最短距离:dist数组

2.初始化dist数组和集合T

顶点 V1 V2 V3 V4 V5 V6
下标 0 1 2 3 4 5
距离 0 10 30 100

T={}

3.进入循环

第一次循环

  1. 遍历dist数组,从集合E-T中顶点对应的值,找出最小值。(即dist[0],顶点V1。)

    (其中集合E是指这个图所有的顶点,E-T={V1,V2,V3,V4,V5,V6} - {} = {V1,V2,V3,V4,V5,V6})

  2. 将最小值对应的顶点(V1)加入到集合T中。(即当前集合T变更为T={V1})

  3. 依次判断以当前顶点(V1)为弧尾的弧(即,,)的权值,是否会影响dist数组的值。

    • 判断dist[0]+对应的权值与dist[2]的值

      (其中dist[2]的值表示的就是源点V1到顶点V3的当前最短距离

      (其中dist[0]+dist[0]表示从源点V1到顶点V1的当前最短路径,加上的权值,就是最短+最短=最短)

      • 结论:相等,故不影响dist[2]的值。
    • 判断dist[0]+对应的权值与dist[4]的值

      • 结论:相等,故不影响dist[4]的值。
    • 判断dist[0]+对应的权值与dist[5]的值

      • 结论:相等,故不影响dist[5]的值。
  4. 此时dist数组状态和集合T的状态如下:

    顶点 V1 V2 V3 V4 V5 V6
    下标 0 1 2 3 4 5
    距离 0 10 30 100

T={V1}

第二次循环

  1. 遍历dist数组,从集合E-T中顶点对应的值,找出最小值。(即dist[2],顶点V3。)

    (E-T={V1,V2,V3,V4,V5,V6} - {V1} = {V2,V3,V4,V5,V6})

  2. 将最小值对应的顶点(V3)加入到集合T中。(即当前集合T变更为T={V1,V3})

  3. 依次判断以当前顶点(V3)为弧尾的弧(即)的权值,是否会影响dist数组的值。

    • 判断dist[2]+对应的权值与dist[3]的值

      (其中dist[2]+dist[2]表示从源点V1到顶点V3的当前最短路径,加上的权值,就是最短+最短=最短)

      • 结论:(10+50)<∞,故影响dist[3]的值。赋值 dist[3]=(10+50)
  4. 此时dist数组状态和集合T的状态如下:

    顶点 V1 V2 V3 V4 V5 V6
    下标 0 1 2 3 4 5
    距离 0 10 60 30 100

    T={V1,V3}

第三次循环

  1. 遍历dist数组,从集合E-T中顶点对应的值,找出最小值。(即dist[4],顶点V5。)

    (E-T={V1,V2,V3,V4,V5,V6} - {V1,V3} = {V2,V4,V5,V6})

  2. 将最小值对应的顶点(V5)加入到集合T中。(即当前集合T变更为T={V1,V3,V5})

  3. 依次判断以当前顶点(V5)为弧尾的弧(即,)的权值,是否会影响dist数组的值。

    • 判断dist[4]+对应的权值与dist[3]的值
      • 结论:(30+20)<60,故影响dist[3]的值。赋值 dist[3]=(30+20)
    • 判断dist[4]+对应的权值与dist[5]的值
      • 结论:(30+60)<100,故影响dist[5]的值。赋值 dist[5]=(30+60)
  4. 此时dist数组状态和集合T的状态如下:

    顶点 V1 V2 V3 V4 V5 V6
    下标 0 1 2 3 4 5
    距离 0 10 50 30 90

    T={V1,V3,V5}

第四次循环

  1. 遍历dist数组,从集合E-T中顶点对应的值,找出最小值。(即dist[3],顶点V4。)

    (E-T={V1,V2,V3,V4,V5,V6} - {V1,V3,V5} = {V2,V4,V6})

  2. 将最小值对应的顶点(V4)加入到集合T中。(即当前集合T变更为T={V1,V3,V5,V4})

  3. 依次判断以当前顶点(V4)为弧尾的弧()的权值,是否会影响dist数组的值。

    • 判断dist[3]+对应的权值与dist[5]的值
      • 结论:(50+10)<90,故影响dist[5]的值。赋值 dist[5]=(50+10)
  4. 此时dist数组状态和集合T的状态如下:

    顶点 V1 V2 V3 V4 V5 V6
    下标 0 1 2 3 4 5
    距离 0 10 50 30 60

    T={V1,V3,V5,V4}

第五次循环

  1. 遍历dist数组,从集合E-T中顶点对应的值,找出最小值。(即dist[5],顶点V6。)

    (E-T={V1,V2,V3,V4,V5,V6} - {V1,V3,V5,V4} = {V2,V6})

  2. 将最小值对应的顶点(V6)加入到集合T中。(即当前集合T变更为T={V1,V3,V5,V4,V6})

  3. 依次判断以当前顶点(V6)为弧尾的弧(无)的权值,是否会影响dist数组的值。

  4. 此时dist数组状态和集合T的状态如下:

    顶点 V1 V2 V3 V4 V5 V6
    下标 0 1 2 3 4 5
    距离 0 10 60 30 90

    T={V1,V3,V5,V4,V6}

第六次循环

  1. 遍历dist数组,从集合E-T中顶点对应的值,找出最小值。(即dist[1],顶点V2。)

    (E-T={V1,V2,V3,V4,V5,V6} - {V1,V3,V5,V4,V6} = {V2})

  2. 将最小值对应的顶点(V2)加入到集合T中。(即当前集合T变更为T={V1,V3,V5,V4,V6,V2})

  3. 依次判断以当前顶点(V2)为弧尾的弧(无)的权值,是否会影响dist数组的值。

  4. 此时dist数组状态和集合T的状态如下:

    顶点 V1 V2 V3 V4 V5 V6
    下标 0 1 2 3 4 5
    距离 0 10 60 30 90

    T={V1,V3,V5,V4,V6,V2}

最终结果

即为dist数组

顶点 V1 V2 V3 V4 V5 V6
下标 0 1 2 3 4 5
距离 0 10 60 30 90

你可能感兴趣的:(数据结构,算法,数据结构)