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(迪杰斯特拉)最短路径算法相关推荐

  1. 1768 Problem A 算法7-15:迪杰斯特拉最短路径算法

    问题 A: 算法7-15:迪杰斯特拉最短路径算法 时间限制: 1 Sec  内存限制: 32 MB 提交: 118  解决: 56 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点 ...

  2. 迪杰斯特拉-最短路径算法

            迪杰斯特拉(Dijkstra)算法是基于动态规划实现的,他的主要功能是求出各节点到顶点的最短路径.         上图展示: 这是各节点连接图,其中A为顶点,求各节点到顶点的最短路径 ...

  3. Codeup墓地-问题 A: 算法7-15:迪杰斯特拉最短路径算法

    题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...

  4. 问题 A: 算法7-15:迪杰斯特拉最短路径算法

    题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...

  5. 题目 1708: 数据结构-Dijskra(迪杰斯特拉)最短路径算法

    参考<大话数据结构> 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用 ...

  6. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

  7. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...

  8. Dijkstra(迪杰斯特拉)算法求单源最短路径问题

    Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...

  9. [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现

    最短路径算法-Dijkstra(迪杰斯特拉)算法分析与实现(C/C++) Dijkstra算法 ----------- 最后更新时间:2011.9.25 ----------- Dijkstra(迪杰 ...

最新文章

  1. 16年10月18号2th运算符与流程结构
  2. 分布式文件系统(FastDFS)安装 配置
  3. 首部高中《人工智能基础》教材问世,40家中学引入
  4. linux-xargs
  5. monkey测试===ios-monkey测试工具
  6. 深入学习keepalived之预备工作--线程
  7. ios 动态化视图_如何在iOS应用中使高度收集视图动态化
  8. 蚂蚁集团暂缓两地上市,重新上市或推迟半年,阿里股价相继大跌...
  9. 斯坦福大学机器学习相关网站——Andrew Ng
  10. isPostBack解释
  11. PHP 获取手机号运营商
  12. 程序员常见常用的英语单词
  13. WebRTC源码中turnserver的使用方法
  14. 2021-1-26-java生成二维码
  15. 【某集训题解】【DAY 2 T3】与非
  16. 《缠中说禅108课》85:逗庄家玩的一些杂史 3
  17. Roxe:下一代全球支付网络
  18. 狂风暴雨——雨过天晴篇:数据流层Namsara发布
  19. 数字化变革与冲突下,如何运用 BI 打造经营分析系统!
  20. 关于深信服SANGFOR PDLAN的介绍

热门文章

  1. jquery.js把我的时间修改了为什么?_电气老手在PLC程序调试修改时的几个必备小窍门,看你知道几个?...
  2. php对数组进行合成的函数,php合并数组函数array_merge()
  3. php 日期 间隔,PHP实现计算日期间隔天数的方法
  4. 交换机指定外部DHCP服务器,H3C交换机DHCP服务器设置步骤
  5. linux mei swap,Linux swapoff命令
  6. php new static,PHP中new self()和new static()的区别用法
  7. QQ浏览器怎么设置主页 QQ浏览器设置默认主页教程
  8. 怎么在pptv里下载电视剧
  9. Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
  10. spring boot配置mybatis和事务管理