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 除法小技巧
Sep 06 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
Python实现将不规范的英文名字首字母大写
Nov 15 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
python中for用来遍历range函数的方法
Jun 08 Python
Python爬取成语接龙类网站
Oct 19 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Keras loss函数剖析
Jul 06 Python
django下创建多个app并设置urls方法
Aug 02 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
Javascript Math对象
2009/08/13 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
Python中super关键字用法实例分析
2015/05/28 Python
Python内存读写操作示例
2018/07/18 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
三维科技面试题
2013/07/27 面试题
致跳高运动员广播稿
2014/01/13 职场文书
运动会稿件50字
2014/02/17 职场文书
安全生产演讲稿
2014/05/09 职场文书
员工趣味活动方案
2014/08/27 职场文书
员工辞职信范文
2015/03/02 职场文书
2015年国培研修感言
2015/08/01 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
把77A收信机改造成收音机
2022/04/05 无线电
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers