# 最短路径算法 Dijkstra
# 输入:含权有向图 G=(V,E),V={1,2,3...n}
# 输出:G中顶点 1 到各个顶点地最短距离
 
Dijkstra算法各点权值变化情况:

 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实现的更多相关文章

  1. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  2. 最短路径算法Dijkstra和A*

    在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...

  3. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

    根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...

  4. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  5. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  6. 最短路径之Dijkstra算法和Floyd-Warshall算法

    最短路径算法 最短路径算法通常用在寻找图中任意两个结点之间的最短路径或者是求全局最短路径,像是包括Dijkstra.A*.Bellman-Ford.SPFA(Bellman-Ford的改进版本).Fl ...

  7. 【算法设计与分析基础】25、单起点最短路径的dijkstra算法

    首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...

  8. POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...

  9. 最短路径问题---Dijkstra算法详解

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

随机推荐

  1. 如果你这么去理解HashMap就会发现它真的很简单

    Java中的HashMap相信大家都不陌生,也是大家编程时最常用的数据结构之一,各种面试题更是恨不得掘地三尺的去问HashMap.HashTable.ConcurrentHashMap,无论面试题多么 ...

  2. NOIP模拟测试11「string&#183;matrix&#183;big」

    打的big出了点小问题,maxx初值我设的0然后少了10分 第二题暴力打炸 第一题剪了一些没用的枝依然40分 总分70 这是一次失败的考试 string 想到和序列那个题很像,但我没做序列,考场回忆学 ...

  3. 『心善渊』Selenium3.0基础 — 9、使用Seleniun中的By类定位元素

    目录 1.使用By定位的前提 2.By定位的方法 3.By定位的使用 4.复数形式的示例 我们还可以通过Seleniun测试框架中的By类,来实现页面中的元素定位. 1.使用By定位的前提 需要导入B ...

  4. hdu 3117 Fibonacci Numbers 矩阵快速幂+公式

    斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...

  5. Java:Java中static关键字作用

    static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static修饰的方法属于类方法,可以通过类名.方法名直接引用 ...

  6. leetcode1047

    思路分析,这题是在栈分类的题目的,所以顺便复习下数据结构,先用java现成的,就当复习了. 1.判断栈顶和插入的元素是否相等,如果相等,那就出栈,不相等入栈结束 java版:

  7. 『心善渊』Selenium3.0基础 — 28、unittest中测试套件的使用

    目录 1.测试套件的作用 2.使用测试套件 (1)入门示例 (2)根据不同的条件加载测试用例(了解) (3)常用方式(推荐) 1.测试套件的作用 在我们实际工作,使用unittest框架会有两个问题: ...

  8. Linux | 压缩与解压详解

    tar tar 命令用于对文件进行打包压缩或解压,格式: tar [选项][文件] tar命令的参数及其作用 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 ...

  9. Luogu P4313 文理分科

    link 最小割 双倍经验 这道题运用了最小割最常用的一种用法:集合划分. 因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用就是最小代价划分集合了. 本题中,题意是将 \(n\cdot m ...

  10. Linux常用命令 day day up系列2

    一.alias--设置别名二.du--统计目录及文件空间占用情况三.mkdir--创建新目录四.touch--创建空文件五.ln--创建链接文件1.链接文件类型六.cp--复制文件或目录七.rm--删 ...