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中使用HTML模版的教程
Apr 29 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
python3处理含有中文的url方法
May 10 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
python之拟合的实现
Jul 19 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
python 获取计算机的网卡信息
Feb 18 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版)
2006/10/09 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP分页函数代码(简单实用型)
2010/12/02 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
php桥接模式应用案例分析
2019/10/23 PHP
JavaScript的Function详细
2006/11/14 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
django 消息框架 message使用详解
2019/07/22 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
python数字类型math库原理解析
2020/03/02 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
化妆品促销方案
2014/02/24 职场文书
员工离职感谢信
2015/01/22 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers