python写算法求最短路径_python 实现dijkstra算法求解最短路径

​ 重点:dijkstra算法按层计算其余点到源点的最短距离,层层扩展。

1. dijkstra算法

求解目标:找到图中源点到其余点的最短距离,是单源点最短距离算法。

整体思路:每一步都寻找到与源点最近的点,层层扩展,是贪心算法。

具体实现:

输入:给定一个图的邻接表M,源点u。

辅助变量:存储与源点最短距离的字典、存储已访问节点的集合。

算法过程:

初始化:将源点加入已访问集合

对已访问集合中每个点的所有邻接点,计算与源点的最短距离存入字典和已访问集合。

重复2,直至所有顶点被访问

2. 求解两点最短路径

​ 利用dijkstra算法,可以找到图中源点到其余点的最短距离。而求解两点间最短路径,只需找到两点的最短距离和路径。因此只需要在dijkstra算法中增添一个判断语句即可得到两点间最短距离。

def dijkstra(adjoin_map, u, v):

'''给定一个图的邻接表M,两点u和v,该代码能返回两点间的最短路径和距离。

:param adjoin_map: {node: [(node1, weight), (node2, weight2)]}

:param u:

:param v:

:return: 损失

'''

if u == v:

return 0

cost_dct = {u: 0} # 与源点的最短距离

to_visited_set = {u} # 需要访问的集合

find_status = False

while not find_status:

# 每次迭代扩展一层节点

cur = to_visited_set.pop()

for adjoin, cost in adjoin_map[cur]:

# 计算最短距离

cost_after = cost_dct[cur] + cost

if adjoin in cost_dct.keys():

if cost_after < cost_dct[adjoin]: # 情况1:如果已访问且距离更短,则更新距离

cost_dct[adjoin] = cost_after

else: # 情况2:未访问,则加入

cost_dct[adjoin] = cost_after

to_visited_set.add(adjoin)

if adjoin == v: # 找到则跳出

find_status = True

break

if v in cost_dct.keys():

return cost_dct[v]

return None

若需要保存最短路径,则只需要增加一个字典,用来保存每个节点的前驱节点。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值