算法 - 图(Graph)- 最短路径(Shortest Path)- Dijkstra(迪杰斯特拉算法)
-
图(Graph)
-
图(Graph)- 最短路径(Shortest Path)
-
图(Graph)- 最短路径(Shortest Path)- Bellman-Ford(贝尔曼-福特算法)
-
图(Graph)- 最短路径(Shortest Path)- Floyd(弗洛伊德算法)
Dijkstra
- Dijkstra属于单源路径最短路径算法,用于计算一个顶点到其他所有顶点的最短路径
适用前提:不能有负权边
时间复杂度:可优化至O(ELogV),E是边数量,V是节点数量 - 由荷兰的科学家Edsger Wybe Dijkstra发明,曾在1972年获得图灵奖
Dijkstra - 等价思考
- Dijkstra的原理其实跟生活中的一些自然现象完全一样
- 把每1个顶点想象成是1块小石头
- 把每1条边想象成1条绳子,每一条绳子都连接着2块小石头,边的权值就是绳子的长度
- 将小石头和绳子平放在一张桌子上(下图是一张俯视图,图中黄色的是桌子)
- 接下来想象一下,手拽着小石头A,慢慢地向上提起来,远离桌面
- B、D、C、E会依次离开桌面
- 最后绷直的绳子就是A到其他小石头的最短路径
- 有一个很关键的消息:
最后离开桌面的小石头
都是被先离开桌面的小石头拉起来的
Dijkstra - 执行过程
- 绿色
已经“离开桌面”
已经确定了最终的最短路径 - 红色
更新了最短路径信息 - 松弛操作(Relaxation):更新2个顶点之间的最短路径
- 这里一般是指:更新源点到另一个点的最短路径
- 松弛操作的意义:尝试找出更短的最短路径
- 确定A到D的最短路径后,对DC、DE边进行松弛操作,更新了A到C、A到E的最短路径