python代码实现狄克斯特拉算法

狄克斯特拉算法找最短路径问题:

之前我们了解过,用广度优先搜索,找出段数最少的路径,但是要找出最快的路径该怎么做呢,为此我们可以用现在提到的算法,狄克斯特拉算法。

我们知道,狄克斯特拉算的辅助图形必须是有向无环加权图,这也就决定了该算法的使用条件。

那什么是有向无环加权图呢?下面举个例子说明一下

另外,值得注意的是:狄克斯特拉算法同样不适用于含有负权边的图,即是,图上的数字不能为负值。

要实现算法需要一下准备工作,首先需要三个散列表,就是python的字典。

然后我们来看一下代码流程

接下来直接上代码:

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 processed: <----如果当前节点的开销更低且未处理过
            lowest_cost = cost  <--------将其视为开销最低的节点
            lowest_cost_node = node
    return lowest_cost_node

这是找出获取花费最低节点的函数

node = find_lowest_cost_node(costs) <------在未处理的节点中找出开销最小的节点
while node is not None:  <-----这个while循环在所有节点都被处理过后结束
    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  <-----同时将该邻居的父节点设置为当前节点
    processed.append(node)  <------将当前节点标记为处理过
    node = find_lowest_cost_node(costs) <---找出接下来要处理的节点,并循环

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值