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 相关文章推荐
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 Python
全面了解Python环境配置及项目建立
Jun 30 Python
Python语言实现将图片转化为html页面
Dec 06 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
python 计算两个列表的相关系数的实现
Aug 29 Python
python输入错误后删除的方法
Oct 12 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
详解pandas赋值失败问题解决
Nov 29 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
Python 一键获取电脑浏览器的账号密码
May 11 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
php数组添加元素方法小结
2014/12/20 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
js选项卡的实现方法
2015/02/09 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
用Python抢过年的火车票附源码
2015/12/07 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
门卫人员岗位职责
2013/12/24 职场文书
优秀通讯员事迹材料
2014/01/28 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
助残日活动总结
2014/08/27 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server