python矩阵/字典实现最短路径算法


Posted in Python onJanuary 17, 2019

前言:好像感觉各种博客的最短路径python实现都花里胡哨的?输出不明显,唉,可能是因为不想读别人的代码吧(明明自己学过离散)。然后可能有些人是用字典实现的?的确字典的话,比较省空间。改天,也用字典试下。先贴个图吧。

python矩阵/字典实现最短路径算法

然后再贴代码:

_=inf=999999#inf
 
def Dijkstra_all_minpath(start,matrix):
 length=len(matrix)#该图的节点数
 path_array=[]
 temp_array=[]
 path_array.extend(matrix[start])#深复制
 temp_array.extend(matrix[start])#深复制
 temp_array[start] = inf#临时数组会把处理过的节点的值变成inf,表示不是最小权值的节点了
 already_traversal=[start]#start已处理
 path_parent=[start]*length#用于画路径,记录此路径中该节点的父节点
 while(len(already_traversal)<length):
  i= temp_array.index(min(temp_array))#找最小权值的节点的坐标
  temp_array[i]=inf
  path=[]#用于画路径
  path.append(str(i))
  k=i
  while(path_parent[k]!=start):#找该节点的父节点添加到path,直到父节点是start
   path.append(str(path_parent[k]))
   k=path_parent[k]
  path.append(str(start))
  path.reverse()#path反序产生路径
  print(str(i)+':','->'.join(path))#打印路径
  already_traversal.append(i)#该索引已经处理了
  for j in range(length):#这个不用多说了吧
   if j not in already_traversal:
    if (path_array[i]+matrix[i][j])<path_array[j]:
     path_array[j] = temp_array[j] =path_array[i]+matrix[i][j]
     path_parent[j]=i#说明父节点是i
 return path_array
 
#领接矩阵
adjacency_matrix=[[0,10,_,30,100],
     [10,0,50,_,_],
     [_,50,0,20,10],
     [30,_,20,0,60],
     [100,_,10,60,0]
     ]
print(Dijkstra_all_minpath(4,adjacency_matrix))

然后输出:

2: 4->2
3: 4->2->3
0: 4->2->3->0
1: 4->2->1
[60, 60, 10, 30, 0]

主要是这样输出的话比较好看,然后这样算是直接算一个点到所有点的最短路径吧。那么写下字典实现吧

def Dijkstra_all_minpath_for_graph(start,graph):
 inf = 999999 # inf
 length=len(graph)
 path_graph={k:inf for k in graph.keys()}
 already_traversal=set()
 path_graph[start]=0
 min_node=start#初始化最小权值点
 already_traversal.add(min_node)#把找到的最小节点添加进去
 path_parent={k:start for k in graph.keys()}
 while(len(already_traversal)<=length):
  p = min_node
  if p!=start:
   path = []
   path.append(str(p))
   while (path_parent[p] != start):#找该节点的父节点添加到path,直到父节点是start
    path.append(str(path_parent[p]))
    p=path_parent[p]
   path.append(str(start))
   path.reverse()#反序
   print(str(min_node) + ':', '->'.join(path))#打印
  if(len(already_traversal)==length):break
  for k in path_graph.keys():#更新距离
   if k not in already_traversal:
    if k in graph[min_node].keys() and (path_graph[min_node]+graph[min_node][k])<path_graph[k]:
     path_graph[k]=path_graph[min_node]+graph[min_node][k]
     path_parent[k]=min_node
  min_value=inf
  for k in path_graph.keys():#找最小节点
   if k not in already_traversal:
    if path_graph[k]<min_value:
     min_node=k
     min_value=path_graph[k]
  already_traversal.add(min_node)#把找到最小节点添加进去
 return path_graph
adjacency_graph={0:{1:10,3:30,4:100},
     1:{0:10,2:50},
     2:{1:50,3:20,4:10},
     3:{0:30,2:20,4:60},
     4:{0:100,2:10,3:60}}
print(Dijkstra_all_minpath_for_graph(4,adjacency_graph))

输出:

2: 4->2
3: 4->2->3
0: 4->2->3->0
1: 4->2->1
{0: 60, 1: 60, 2: 10, 3: 30, 4: 0}

还行吧,有时间再看看networkx这个库怎么说。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
Python 文件操作实现代码
Oct 07 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
python 多线程串行和并行的实例
Feb 22 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
python tkinter canvas使用实例
Nov 04 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
python3 简单实现组合设计模式
Jul 02 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
python使用pymysql模块操作MySQL
Jun 16 Python
python实现Dijkstra静态寻路算法
Jan 17 #Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 #Python
python实现dijkstra最短路由算法
Jan 17 #Python
Pycharm 设置默认头的图文教程
Jan 17 #Python
python实现狄克斯特拉算法
Jan 17 #Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 #Python
python最小生成树kruskal与prim算法详解
Jan 17 #Python
You might like
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
python原始套接字编程示例分享
2014/02/21 Python
Python使用MD5加密字符串示例
2014/08/22 Python
Python中的默认参数详解
2015/06/24 Python
Python中将字典转换为列表的方法
2016/09/21 Python
浅谈五大Python Web框架
2017/03/20 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
Django框架 querySet功能解析
2019/09/04 Python
python实现猜数字游戏
2020/03/25 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
python调用百度API实现人脸识别
2020/11/17 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
商场拾金不昧表扬信
2014/01/13 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
公司请假条范文
2014/04/11 职场文书
大学生交通专业求职信
2014/09/01 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
刑事撤诉申请书
2015/05/18 职场文书