# 最短路径算法 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. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇

    作者简介: 打盹的消防车--活跃于Luat社群的新生代全能开发者,东北小伙儿爽朗幽默.好学敏思,更是实力行动派.幼年曾手握火红炽铁而后全然无恙,堪称魔幻经历:如今热衷于各类嵌入式软硬件研究,快意物联江 ...

  2. Django-Auth模块之auth_user表

    一.Auth模块之auth_user表 在创建Django项目之后直接执行数据迁移命令会自动生成许多表. Django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是aut ...

  3. 开关电源(1)之BUCK降压变换器工作原理及Multisim实例仿真

    开关电源(Switching  Mode  Power  Supply)即开关稳压电源,是相对于线性稳压电源的一种的新型稳压电源电路,它通过对输出电压实时监测并动态控制开关管导通与断开的时间比值来稳定 ...

  4. VRRP简介以及配置案例

    一.背景 二.VRRP 概念介绍 三.实验操作 一.背景 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络,如果此时默认网关设备发生故障,将中断所有用户终端的网络访问,这很可能会给用户带来 ...

  5. excel VBA构造函数就是这么简单

    Function test(a As Integer)'构造函数名字为test参数为a且为int型  If a >= 90 Then     Debug.Print "优秀" ...

  6. Ubuntu 之 Esc and CapsLK

    Ubuntu 更换 CapsLK 和 ESC 内容如下 // vim .xmodmap !! No Caps Lock clear lock !! Make Caps_lock an escape k ...

  7. POJ 3126 Prime Path 简单广搜(BFS)

    题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...

  8. AcWing 1290. 越狱

    监狱有连续编号为1~n的n个房间,每个房间关押一个犯人.有 M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人信仰的宗教相同,就可能发生越狱.求有多少种状态可能发生越狱. #include< ...

  9. SpringBoot:SpringBoot中@Value注入失败

    1. 第一步检测语法是否正确 @Value("${test}") private String test; 2.第二步检测配置文件中是否有进行配置 url=testusername ...

  10. idea中IDEA优化配置

    进入IDEA 设置.两种方法: 1,File  -> Settings 2,工具栏有个工具按钮点下(假如没工具栏,View -> 选下Toolbar) 进入设置页面,从上到下,主要是 外观 ...