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中文件遍历的两种方法
Jun 16 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
浅谈关于Python3中venv虚拟环境
Aug 01 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 Python
python实现批量移动文件
Apr 05 Python
Python集合set()使用的方法详解
Mar 18 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
Python列表推导式的使用方法
2013/11/21 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
员工入职担保书范文
2014/04/01 职场文书
庆七一宣传标语
2014/10/08 职场文书
司机岗位职责
2015/02/04 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android