最短路径问题 Dijkstra ——Python实现
1 class Vertex:
2 #顶点类
3 def __init__(self,vid,outList):
4 self.vid = vid #出边
5 self.outList = outList #出边指向的顶点id的列表,也可以理解为邻接表
6 self.know = False #默认为假
7 self.dist = float('inf') #s到该点的距离,默认为无穷大
8 self.prev = 0 #上一个顶点的id,默认为0
9 def __eq__(self, other):
10 if isinstance(other, self.__class__):
11 return self.vid == other.vid
12 else:
13 return False
14 def __hash__(self):
15 return hash(self.vid)
1 #创建顶点对象
2 v1=Vertex(1,[2,3])
3 v2=Vertex(2,[3,4])
4 v3=Vertex(3,[5])
5 v4=Vertex(4,[3,5,6])
6 v5=Vertex(5,[6])
7 v6=Vertex(6,[])
8
9 #存储边的权值
10 edges = dict()
11 def add_edge(front,back,value):
12 edges[(front,back)]=value
13 add_edge(1,2,1)
14 add_edge(1,3,12)
15 add_edge(2,3,9)
16 add_edge(2,4,3)
17 add_edge(3,5,5)
18 add_edge(4,3,4)
19 add_edge(4,5,13)
20 add_edge(4,6,15)
21 add_edge(5,6,4)
1 #创建一个长度为7的数组,来存储顶点,0索引元素不存
2 vlist = [False,v1,v2,v3,v4,v5,v6]
3 #使用set代替优先队列,选择set主要是因为set有方便的remove方法
4 vset = set([v1,v2,v3,v4,v5,v6])
1 def get_unknown_min():#此函数则代替优先队列的出队操作
2 the_min = 0
3 the_index = 0
4 j = 0
5 for i in range(1,len(vlist)):
6 if(vlist[i].know is True):
7 continue
8 else:
9 if(j==0):
10 the_min = vlist[i].dist
11 the_index = i
12 else:
13 if(vlist[i].dist < the_min):
14 the_min = vlist[i].dist
15 the_index = i
16 j += 1
17 #此时已经找到了未知的最小的元素是谁
18 vset.remove(vlist[the_index])#相当于执行出队操作
19 return vlist[the_index]
1 def main():
2 #将v1设为顶点
3 v1.dist = 0
4
5 while(len(vset)!=0):
6 v = get_unknown_min()
7 print(v.vid,v.dist,v.outList)
8 v.know = True
9 for w in v.outList:#w为索引
10 if(vlist[w].know is True):
11 continue
12 if(vlist[w].dist == float('inf')):
13 vlist[w].dist = v.dist + edges[(v.vid,w)]
14 vlist[w].prev = v.vid
15 else:
16 if((v.dist + edges[(v.vid,w)])<vlist[w].dist):
17 vlist[w].dist = v.dist + edges[(v.vid,w)]
18 vlist[w].prev = v.vid
19 else:#原路径长更小,没有必要更新
20 pass
函数调用:
1 main()
2 print('v.dist 即为从起始点到该点的最短路径长度:')
3 print('v1.prev:',v1.prev,'v1.dist',v1.dist)
4 print('v2.prev:',v2.prev,'v2.dist',v2.dist)
5 print('v3.prev:',v3.prev,'v3.dist',v3.dist)
6 print('v4.prev:',v4.prev,'v4.dist',v4.dist)
7 print('v5.prev:',v5.prev,'v5.dist',v5.dist)
8 print('v6.prev:',v6.prev,'v6.dist',v6.dist)
运行结果:
1 0 [2, 3]
2 1 [3, 4]
4 4 [3, 5, 6]
3 8 [5]
5 13 [6]
6 17 []
v.dist 即为从起始点到该点的最短路径长度:
v1.prev: 0 v1.dist 0
v2.prev: 1 v2.dist 1
v3.prev: 4 v3.dist 8
v4.prev: 2 v4.dist 4
v5.prev: 3 v5.dist 13
v6.prev: 5 v6.dist 17
最短路径问题 Dijkstra ——Python实现的更多相关文章
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- 最短路径算法Dijkstra和A*
在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 最短路径之Dijkstra算法和Floyd-Warshall算法
最短路径算法 最短路径算法通常用在寻找图中任意两个结点之间的最短路径或者是求全局最短路径,像是包括Dijkstra.A*.Bellman-Ford.SPFA(Bellman-Ford的改进版本).Fl ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...
- 最短路径问题---Dijkstra算法详解
侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...
随机推荐
- Mybatis 中经典的 9 种设计模式!面试可以吹牛了
虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到.Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...
- SpringBoot代码与jar包分离部署
第一步,打出带有jar包的SpringBoot工程 首先配置pom.xml文件 <build> <finalName>demo</finalName> <pl ...
- Visual Studio 2019 v16.10 和 v16.11 Preview 1 现已推出!
Visual Studio 2019 v16.10有什么新功能? 我们很高兴地宣布Visual Studio 2019 v16.10 GA 和 v16.11 preview 1发布.此版本使我们的主题 ...
- 将Flink计算完毕后的数据Sink到Nebula
Flink是目前流计算的隐形王者,在国际国内有有庞大的拥趸. Nebula是国产图数据库的后起之秀,在DBEngines中排名也逐年上升. 将两者进行结合,可以产生很多应用场景:比如实时计算服务链路调 ...
- testt
一级标题 二级标题 三级标题 四级标题 l 1
- Linux中cut,sort,uniq和wc的用法
一.cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的.1.语法格式为:cut [-bn] [fil ...
- JAVA并发(8)-ThreadPoolExecutor的讲解
很久前(2020-10-23),就有想法学习线程池并输出博客,但是写着写着感觉看不懂了,就不了了之了.现在重拾起,重新写一下(学习一下). 线程池的优点也是老生常谈的东西了 减少线程创建的开销(任务数 ...
- 暑假自学java第十二天
1, 创建String 字符串 Java 中的字符串是一连串的字符,与其他计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理.将字符串作为内置的对象处理,允许Jav ...
- mysql导入脚本
#登陆 mysql -u root -p #创建数据库 CREATE DATABASE `gps` CHARACTER SET utf8 COLLATE utf8_general_ci; #选择数据库 ...
- MySQL 那些常见的错误设计规范
依托于互联网的发达,我们可以随时随地利用一些等车或坐地铁的碎片时间学习以及了解资讯.同时发达的互联网也方便人们能够快速分享自己的知识,与相同爱好和需求的朋友们一起共同讨论. 但是过于方便的分享也让知识 ...