【Python_038】算法 | 狄克斯特拉算法(Dijkstra)

本文详细介绍了狄克斯特拉算法,它是无负权重有向无环图中寻找最短路径的算法。通过参考《算法图解》一书,阐述了算法思路,并给出实例解释如何从起点找到终点的最短路径。同时提到了负权重情况下应使用贝尔曼-福德算法。
摘要由CSDN通过智能技术生成

上篇博客介绍了广度优先搜索。本篇博客介绍狄克斯特拉算法,可以算是BFS进阶版(加上了权重的考量)
书籍参考:《算法图解》

狄克斯特拉算法
  • 找出加权图中前往X的最短路径
  • 狄克斯特拉算法只适用于无负权重的有向无环图(无向图意味着两个节点彼此指向对方,其实就是环)
  • 有负权重的参考贝尔曼-福德算法(Bellman-Ford algorithm)

算法思路:

  1. 找出“最便宜”的节点,即可在最短时间内到达的节点。
  2. 对于该节点的邻居,检查是否有前往它们的更短路径,如果有,就更新其开销(找出图中最便宜的节点,并确保没有到该节点的更便宜的路径)
  3. 重复这个过程,直到对图中的每个节点都这样做了
  4. 计算最终路径。
实例

在这里插入图片描述
*上图源自《算法图解》

问题:从起点走到终点,求最短路径

代码实现

##创建graph表
graph = {}
graph['start']={}
graph['start']['a'] = 6
graph['start']['b'] = 2

graph['a'] = {}
graph['a']['fin'] = 1

graph['b'] = {}
graph['b']['a'] = 3
graph['b']['fin'] = 5
graph['fin'] = {}

## 存储每个节点开销
infinity = float('inf')
costs = {}
costs['a'] = 6
costs['b'] = 2
costs['fin'] = infinity

## 创建父节点
parents = {}
parents['a'] = 'start'
parents['b'] = 'start'
parents['fin'] = None

proceeded = []


def find_lowest_cost_node(costs):
    lowest_cost = float('inf')
    lowest_cost_node = None
    for node in costs:
        cost = costs[node]
        if cost < lowest_cost and node not in proceeded:
            lowest_cost = cost
            lowest_cost_node = node
    return lowest_cost_node

node = find_lowest_cost_node(costs)

while node is not None:
    cost = costs[node]
    neighbors = graph[node]
    for n in neighbors.keys(): #遍历当前节点所有邻居
        new_cost = cost + neighbors[n]
        if costs[n] > new_cost: #如果有更近路径,就更新
            costs[n] = new_cost
            parents[n] = node
    proceeded.append(node)
    node = find_lowest_cost_node(costs)
    print(f'{node} is done')
print(f'{costs["fin"]} is mininum')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值