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爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
详解Python:面向对象编程
Apr 10 Python
Python数据类型之Number数字操作实例详解
May 08 Python
python用match()函数爬数据方法详解
Jul 23 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
用python解压分析jar包实例
Jan 16 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
python中wx模块的具体使用方法
May 15 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
python中_del_还原数据的方法
Dec 09 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调用Twitter的RSS的实现代码
2010/03/10 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
YII框架http缓存操作示例
2019/04/29 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python网络编程 Python套接字编程
2017/09/13 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python实现最长公共子序列
2018/05/22 Python
Python中如何导入类示例详解
2019/04/17 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
sklearn+python:线性回归案例
2020/02/24 Python
python 实现音频叠加的示例
2020/10/29 Python
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
学习新党章思想汇报
2014/01/09 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
商业街策划方案
2014/05/31 职场文书
2015年招聘工作总结
2014/12/12 职场文书
实习科室评语
2015/01/04 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL