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程序的执行效率的教程
Apr 02 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
python是否适合网页编程详解
Oct 04 Python
Python如何使用turtle库绘制图形
Feb 26 Python
python实现TCP文件传输
Mar 20 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
python tqdm用法及实例详解
Jun 16 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
python笔记(2)
2012/10/24 Python
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
python实现五子棋人机对战游戏
2020/03/25 Python
python实现简单井字棋小游戏
2020/03/05 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
zooplus波兰:在线宠物店
2019/07/21 全球购物
如何选择使用结构还是类
2014/05/30 面试题
大学毕业生的自我鉴定
2013/11/30 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
大学生励志演讲稿
2014/04/25 职场文书
学习心理学的体会
2014/11/07 职场文书
护士工作心得体会
2016/01/25 职场文书
Django操作cookie的实现
2021/05/26 Python