Dijkstra 算法是一种常用的图算法,用于计算从图中的一个节点到其他所有节点的最短路径。该算法是由荷兰计算机科学家 Edsger W. Dijkstra 在 1959 年提出。
算法描述
Dijkstra 算法的输入是一个带权图(weighted graph),其中每条边都有一个权重(weight)。算法的目标是计算从图中的一个节点(称为源节点)到其他所有节点的最短路径。
算法的步骤如下:
- 初始化:将源节点的距离设为 0,将其他所有节点的距离设为无穷大。
- 选择最小距离节点:从所有未处理的节点中选择距离最小的节点。
- 更新距离:对于选定的节点,更新其邻居节点的距离。如果邻居节点的距离可以通过当前节点更新为更小的值,则更新其距离。
- 重复步骤 2-3:直到所有节点都被处理。
算法伪代码
function Dijkstra(Graph, source):
create a priority queue Q
for each vertex v in Graph:
distance[v] = infinity
previous[v] = undefined
distance[source] = 0
Q.enqueue(source)
while Q is not empty:
u = Q.dequeue()
for each neighbor v of u:
alt = distance[u] + weight(u, v)
if alt < distance[v]:
distance[v] = alt
previous[v] = u
Q.enqueue(v)
return distance, previous
算法时间复杂度
Dijkstra 算法的时间复杂度取决于图的结构和实现方式。一般来说,使用堆实现的 Dijkstra 算法的时间复杂度为 O(|E|log|V|),其中 |E| 是图的边数,|V| 是图的节点数。
应用场景
Dijkstra 算法有很多应用场景,例如:
- 寻找最短路径:在交通网络、通信网络等领域中,Dijkstra 算法可以用于寻找从一个节点到另一个节点的最短路径。
- 路由选择:在计算机网络中,Dijkstra 算法可以用于选择最短路径来传输数据包。
- Logistics:在物流领域中,Dijkstra 算法可以用于寻找最短路径来运输货物。
总之,Dijkstra 算法是一种常用的图算法,用于计算从图中的一个节点到其他所有节点的最短路径。