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实现批量读取word中表格信息的方法
Jul 30 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
python+ffmpeg视频并发直播压力测试
Mar 06 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
在Python中使用Neo4j的方法
Mar 14 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
Python数据可视化:泊松分布详解
Dec 07 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 Python
对PyTorch中inplace字段的全面理解
May 22 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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关联链接常用代码
2012/11/05 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
在Django的视图中使用数据库查询的方法
2015/07/16 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
教育技术职业规划范文
2014/03/04 职场文书
青年文明号申报材料
2014/12/23 职场文书
护士个人总结范文
2015/02/13 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
预备党员入党感想
2015/08/10 职场文书
导游词之日月潭
2019/11/05 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
mysql查找连续出现n次以上的数字
2022/05/11 MySQL
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript