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中List.count()方法的使用教程
May 20 Python
Python实现求最大公约数及判断素数的方法
May 26 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
python 匹配url中是否存在IP地址的方法
Jun 04 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
python 文件查找及内容匹配方法
Oct 25 Python
对python中的argv和argc使用详解
Dec 15 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 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/11/19 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
监控 url fragment变化的js代码
2010/04/19 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
python中的多重继承实例讲解
2014/09/28 Python
python实现上传下载文件功能
2020/11/19 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
应聘面试自我评价
2014/01/24 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
规划编制实施方案
2014/03/15 职场文书
家庭贫困证明
2014/09/23 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL