Dijkstra 算法流程的举例说明

Dijkstra’s Algorithm(迪杰斯特拉算法)是求解最短路问题的一个经典算法。
本文通过一个简单的例子,举例说明其算法流程。


算法适用场景:非负网络


算例如下图所示:
算例

iteration 1:

节点标签状态
1[0, -]最优
2[100, 1]临时
3[30, 1]临时

iteration 1

iteration 2:

由于从起点(节点 1)出发所到达的节点中,节点 3 所行距离最短,故将节点 3 的状态更新为最优。
然后从节点 3 出发,继续迭代。

节点标签状态
1[0, -]最优
2[100, 1]临时
3[30, 1]最优
4[30+10, 3] = [40, 3]临时
5[30+60, 3] = [90, 3]临时

iteration 2

iteration 3:

由于节点 4 只能由节点 3 直接到达,且节点 3 已经为最优状态,故将节点 4 的状态更新为最优。
然后从节点 4 出发,继续迭代。

节点标签状态
1[0, -]最优
2[40+15, 4] = [55, 4]临时
3[30, 1]最优
4[40, 3]最优
5[90, 3] 或 [40+50, 4] = [90, 3 或 4]临时

iteration 3

iteration 4:

由于节点 2 和节点 5 的所有前序节点均为最优状态,故将所有节点的状态更新为最优,算法运行结束。

节点标签状态
1[0, -]最优
2[55, 4]最优
3[30, 1]最优
4[40, 3]最优
5[90, 3 或 4]最优

iteration 4


参考文献:

Hamdy A. Taha. Operations Research an Introduction 初级篇 Chapter 6

Dijkstra算法是一种用于解决单源最短路径问题的贪心算法。它的基本思想是:从起点开始,每次选择一个距离起点最近的未标记顶点,用这个顶点更新其它顶点的距离。经过标记的顶点距离起点的距离是最短的。 下面是一个简单的Python实现代码: ```python import heapq def dijkstra(graph, start): # 初始化距离字典,起点距离为0,其余为正无穷大 distances = {vertex: float('inf') for vertex in graph} distances[start] = 0 # 初始化堆和visited集合 heap = [(0, start)] visited = set() while heap: # 取出堆中距离最小的顶点 (current_distance, current_vertex) = heapq.heappop(heap) # 如果该顶点已经被访问过,则直接跳过 if current_vertex in visited: continue # 将该顶点标记为已访问 visited.add(current_vertex) # 遍历该顶点的邻居 for neighbor, weight in graph[current_vertex].items(): # 如果邻居已经被访问过,则直接跳过 if neighbor in visited: continue # 计算从起点到邻居的距离 distance = current_distance + weight # 如果该距离比已经存在的距离小,则更新距离 if distance < distances[neighbor]: distances[neighbor] = distance # 将邻居加入堆中 heapq.heappush(heap, (distance, neighbor)) return distances ``` 接下来是一个简单的例子: ```python graph = { 'A': {'B': 2, 'C': 4}, 'B': {'C': 1, 'D': 7}, 'C': {'D': 3}, 'D': {} } print(dijkstra(graph, 'A')) ``` 输出为: ``` {'A': 0, 'B': 2, 'C': 3, 'D': 6} ``` 这表示从起点A到达各个顶点的最短距离分别为0、2、3、6。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值