# 最短路径算法 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. 源码分析Gateway请求转发

    本期我们主要还是讲解一下Gateway,上一期我们讲解了一下Gateway中进行路由转发的关键角色,过滤器和断言是如何被加载的,上期链接: https://www.cnblogs.com/guoxia ...

  2. 安装linux 报错(initramfs) Unable to find a medium containing a live file system

    如题,linux 安装报错:(initramfs) Unable to find a medium containing a live file system 我是用UItraISO做的启动盘遇到这个 ...

  3. 【C语言】整型在内存中的存储

    整型在内存中的存储 1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码.反码和补码 2.1 定义 计算机在表示一个数字 ...

  4. 03 Git 以及 其 GUI TortoiseGit 的下载与安装

    前面也说过嘛,要紧跟大佬们的步伐--选择最受欢迎的版本控制系统. 而根据 [JetBrains](JetBrains: Essential tools for software developers ...

  5. (Element UI 组件 Table)去除单元格底部的横线

    Element UI 组件 Table 有一个属性 border,添加它可以增加纵向边框,但是无法控制横线边框,因此即使是最简单的 el-table,也会包含一个底部横线. 这个底部横线其实是一个 b ...

  6. 【LeetCode每日一题 Day 1】1. 两数之和

    大家好,我是编程熊,今天是LeetCode每日一题的第一天,今天的你比昨天更加优秀啦! 题意 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target ...

  7. redis优化小建议

    1.优化的一些小建议 1.尽量使用短的key 当然在精简的同时,不要为了key的"见名知意".对于value有些也可精简,比如性别使用0.1. 2.每个redis设置合理内存 每个 ...

  8. SQLite Encryption(加密)新姿势

    什么是SQLite? SQLite是一个C语言实现的小型.快速.自包含.高可靠性.功能全面的SQL数据库引擎. 起因: 刚好项目上有个需求,需要使用VS2019+.Net famework 4.6.1 ...

  9. com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)

    RabbitMQ 基于Erlang 实现, 客户端可以用Python | Java | Ruby | PHP | C# | Javascript | Go等语言来实现.这里做个java语言的测试.首先 ...

  10. windows服务器下MySQL配置字符集

    这俩天公司使用.netcore微服务+mysql做项目,mysql在使用的时候总是出现一些字符集的问题,修改utf8或utf8mb4后mysql的服务就启动不了,这里做下记录如果把my.ini中的字符 ...