python3dijkstra_python3 实现Dijkstra(迪杰斯特拉)最短路径算法
Dijkstra
单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
python 算法实现
import queue
from collections import namedtuple
Edge = namedtuple('Edge', ['vertex', 'weight'])
class GraphUndirectedWeighted(object):
def __init__(self, vertex_count):
self.vertex_count = vertex_count
self.adjacency_list = [[] for _ in range(vertex_count)]
def add_edge(self, source, dest, weight):
assert source < self.vertex_count
assert dest < self.vertex_count
self.adjacency_list[source].append(Edge(dest, weight))
self.adjacency_list[dest].append(Edge(source, weight))
def get_edge(self, vertex):
for e in self.adjacency_list[vertex]:
yield e
def get_vertex(self):
for v in range(self.vertex_count):
yield v
def dijkstra(graph, source, dest):
q = queue.PriorityQueue()
parents = []
distances = []
start_weight = float("inf")
for i in graph.get_vertex():
weight = start_weight
if source == i:
weight = 0
distances.append(weight)
parents.append(None)
q.put(([0, source]))
while not q.empty():
v_tuple = q.get()
v = v_tuple[1]
for e in graph.get_edge(v):
candidate_distance = distances[v] + e.weight
if distances[e.vertex] > candidate_distance:
distances[e.vertex] = candidate_distance
parents[e.vertex] = v
# primitive but effective negative cycle detection
if candidate_distance < -1000:
raise Exception("Negative cycle detected")
q.put(([distances[e.vertex], e.vertex]))
shortest_path = []
end = dest
while end is not None:
shortest_path.append(end)
end = parents[end]
shortest_path.reverse()
return shortest_path, distances[dest]
def main():
g = GraphUndirectedWeighted(9)
g.add_edge(0, 1, 4)
g.add_edge(1, 7, 6)
g.add_edge(1, 2, 1)
g.add_edge(2, 3, 3)
g.add_edge(3, 7, 1)
g.add_edge(3, 4, 2)
g.add_edge(3, 5, 1)
g.add_edge(4, 5, 1)
g.add_edge(5, 6, 1)
g.add_edge(6, 7, 2)
g.add_edge(6, 8, 2)
g.add_edge(7, 8, 2)
# for testing negative cycles
# g.add_edge(1, 9, -5)
# g.add_edge(9, 7, -4)
shortest_path, distance = dijkstra(g, 0, 1)
assert shortest_path == [0, 1] and distance == 4
shortest_path, distance = dijkstra(g, 0, 8)
assert shortest_path == [0, 1, 2, 3, 7, 8] and distance == 11
shortest_path, distance = dijkstra(g, 5, 0)
assert shortest_path == [5, 3, 2, 1, 0] and distance == 9
shortest_path, distance = dijkstra(g, 1, 1)
assert shortest_path == [1] and distance == 0
if __name__ == "__main__":
main()
python3dijkstra_python3 实现Dijkstra(迪杰斯特拉)最短路径算法相关推荐
- 1768 Problem A 算法7-15:迪杰斯特拉最短路径算法
问题 A: 算法7-15:迪杰斯特拉最短路径算法 时间限制: 1 Sec 内存限制: 32 MB 提交: 118 解决: 56 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点 ...
- 迪杰斯特拉-最短路径算法
迪杰斯特拉(Dijkstra)算法是基于动态规划实现的,他的主要功能是求出各节点到顶点的最短路径. 上图展示: 这是各节点连接图,其中A为顶点,求各节点到顶点的最短路径 ...
- Codeup墓地-问题 A: 算法7-15:迪杰斯特拉最短路径算法
题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...
- 问题 A: 算法7-15:迪杰斯特拉最短路径算法
题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...
- 题目 1708: 数据结构-Dijskra(迪杰斯特拉)最短路径算法
参考<大话数据结构> 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用 ...
- 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
一.基础知识 有向图 无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...
- Dijkstra(迪杰斯特拉)算法求单源最短路径问题
Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...
- [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现
最短路径算法-Dijkstra(迪杰斯特拉)算法分析与实现(C/C++) Dijkstra算法 ----------- 最后更新时间:2011.9.25 ----------- Dijkstra(迪杰 ...
最新文章
- 16年10月18号2th运算符与流程结构
- 分布式文件系统(FastDFS)安装 配置
- 首部高中《人工智能基础》教材问世,40家中学引入
- linux-xargs
- monkey测试===ios-monkey测试工具
- 深入学习keepalived之预备工作--线程
- ios 动态化视图_如何在iOS应用中使高度收集视图动态化
- 蚂蚁集团暂缓两地上市,重新上市或推迟半年,阿里股价相继大跌...
- 斯坦福大学机器学习相关网站——Andrew Ng
- isPostBack解释
- PHP 获取手机号运营商
- 程序员常见常用的英语单词
- WebRTC源码中turnserver的使用方法
- 2021-1-26-java生成二维码
- 【某集训题解】【DAY 2 T3】与非
- 《缠中说禅108课》85:逗庄家玩的一些杂史 3
- Roxe:下一代全球支付网络
- 狂风暴雨——雨过天晴篇:数据流层Namsara发布
- 数字化变革与冲突下,如何运用 BI 打造经营分析系统!
- 关于深信服SANGFOR PDLAN的介绍
热门文章
- jquery.js把我的时间修改了为什么?_电气老手在PLC程序调试修改时的几个必备小窍门,看你知道几个?...
- php对数组进行合成的函数,php合并数组函数array_merge()
- php 日期 间隔,PHP实现计算日期间隔天数的方法
- 交换机指定外部DHCP服务器,H3C交换机DHCP服务器设置步骤
- linux mei swap,Linux swapoff命令
- php new static,PHP中new self()和new static()的区别用法
- QQ浏览器怎么设置主页 QQ浏览器设置默认主页教程
- 怎么在pptv里下载电视剧
- Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
- spring boot配置mybatis和事务管理