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的类实例属性访问规则探讨
Jan 30 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
Python中的rfind()方法使用详解
May 19 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Django中url的反向查询的方法
Mar 14 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
在Python中通过threshold创建mask方式
Feb 19 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
Python实现爬取并分析电商评论
Jun 19 Python
python pymysql库的常用操作
Oct 16 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 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
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
javascript中对对层的控制
2006/12/29 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
js导出txt示例代码
2014/01/14 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
论文指导教师评语
2014/04/28 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
防震减灾主题班会
2015/08/14 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书