算法 - 图(Graph)- 最短路径(Shortest Path)- Dijkstra(迪杰斯特拉算法)


Dijkstra

  • Dijkstra属于单源路径最短路径算法,用于计算一个顶点到其他所有顶点的最短路径
    适用前提:不能有负权边
    时间复杂度:可优化至O(ELogV),E是边数量,V是节点数量
  • 由荷兰的科学家Edsger Wybe Dijkstra发明,曾在1972年获得图灵奖
    在这里插入图片描述

Dijkstra - 等价思考

  • Dijkstra的原理其实跟生活中的一些自然现象完全一样
  1. 把每1个顶点想象成是1块小石头
  2. 把每1条边想象成1条绳子,每一条绳子都连接着2块小石头,边的权值就是绳子的长度
  3. 将小石头和绳子平放在一张桌子上(下图是一张俯视图,图中黄色的是桌子)
  • 接下来想象一下,手拽着小石头A,慢慢地向上提起来,远离桌面
  1. B、D、C、E会依次离开桌面
  2. 最后绷直的绳子就是A到其他小石头的最短路径
  • 有一个很关键的消息:
    最后离开桌面的小石头
    都是被先离开桌面的小石头拉起来的
    在这里插入图片描述

Dijkstra - 执行过程

在这里插入图片描述

  • 绿色
    已经“离开桌面”
    已经确定了最终的最短路径
  • 红色
    更新了最短路径信息
    在这里插入图片描述
  • 松弛操作(Relaxation):更新2个顶点之间的最短路径
  1. 这里一般是指:更新源点到另一个点的最短路径
  2. 松弛操作的意义:尝试找出更短的最短路径
  • 确定A到D的最短路径后,对DC、DE边进行松弛操作,更新了A到C、A到E的最短路径
    在这里插入图片描述
发布了163 篇原创文章 · 获赞 18 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/songzhuo1991/article/details/103072113