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清除字符串里非数字字符的方法
Jul 02 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
Python自定义类的数组排序实现代码
Aug 28 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
PHP实现发送和接收JSON请求
Jun 07 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
python实现键盘输入的实操方法
Jul 16 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 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中通过curl smtp发送邮件
2012/06/05 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
想学python 这5本书籍你必看!
2018/12/11 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
python脚本和网页有何区别
2020/07/02 Python
浅谈python锁与死锁问题
2020/08/14 Python
Django缓存Cache使用详解
2020/11/30 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
学习交流会主持词
2014/04/01 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
Python中requests做接口测试的方法
2021/05/30 Python