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 29 Python
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
python实现的系统实用log类实例
Jun 30 Python
python实现RSA加密(解密)算法
Feb 17 Python
Python 数据结构之队列的实现
Jan 22 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
python opencv如何实现图片绘制
Jan 19 Python
python3 字符串知识点学习笔记
Feb 08 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
python/golang 删除链表中的元素
Sep 14 Python
python切割图片的示例
Nov 12 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实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
PHP速成大法
2015/01/30 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
回顾Javascript React基础
2019/06/15 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python translator使用实例
2008/09/06 Python
Python代码的打包与发布详解
2014/07/30 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
python数据爬下来保存的位置
2020/02/17 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
Python txt文件如何转换成字典
2020/11/03 Python
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
C语言面试题
2015/10/30 面试题
中学生爱国演讲稿
2013/12/31 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
小学教师师德感言
2014/02/10 职场文书
上课说话检讨书500字
2014/11/01 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书