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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java SSM图书管理系统简单版设计和实现

本项目演示链接地址 》 主要技术&#xff1a;后台采用技术&#xff1a; SSM框架(SpringMVC Spring Mybatis) 前台采用技术&#xff1a; div css 功能比较简单、适合学习使用 主要功能&#xff1a;登录、图书类型添加、图书类型列表、编辑和删除、图书上传。图书列表、导出…

樊登读书会终身成长读后感_终身成长读后感

当我们还是婴儿时&#xff0c;我们学习走路、说话&#xff0c;跌倒了、说错了&#xff0c;不会害怕和丢脸。后来&#xff0c;我们懂得了更多&#xff0c;反而怕这怕那&#xff0c;止步不前了。为什么呢&#xff1f;因为我们转变了思维模式。《终身成长》一书中提出了人的思维是…

html中的行内标签吗,HTML标签中行内元素和块级元素详解

本文主要和大家详细介绍了HTML常用的标签中行内元素和块级元素&#xff0c;需要的朋友参考下吧&#xff0c;希望能帮助到大家。块元素(block element) HTML标签分类明细* address - 地址* blockquote - 块引用* center - 举中对齐块* dir - 目录列表* p - 常用块级容易&#xf…

基于javaweb jsp+servlet学生宿舍管理系统设计和实现

本项目演示链接地址 》 主要技术&#xff1a;spring、jsp、servlet、mysql、tomcat 、jsp、jquery、css、c390 、cookie、session等基本技术实现 主要功能:不同角色登录、宿舍管理员管理、学生信息管理、宿舍信息管理、学生缺勤管理、修改密码和退出功能。 系统功能截图&…

html泰勒展开,【转载】泰勒展开式

泰勒展开式对于利用FPGA实现算法来说非常实用&#xff0c;可以将除法等对硬件不友好的运算转变为乘加操作。特此转载以下博文&#xff0c;原文标题及链接为&#xff1a;泰勒展开式 - guoxiang - 博客园https://www.cnblogs.com/guo-xiang/p/6662881.html数学中&#xff0c;泰勒…

rgba通道转rgb_将RGBA颜色转换为RGB

潇潇雨雨这是一些Java代码(适用于Android API 24)&#xff1a; //int rgb_background Color.parseColor("#ffffff"); //white background //int rgba_color Color.parseColor("#8a000000"); //textViewColor int defaultTextViewC…

基于Java Swing五子棋小游戏设计和实现

本项目演示链接地址 》 前言: 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。 在上古的神话传说中有“女…

ueditor工具栏弹出html,UEditor工具栏上自定义按钮、图标、事件、窗口页面

第一步&#xff1a;找到editor_config.js(或者ueditor.config.js)文件中的toolbars参数&#xff0c;增加一个“camnpr”字符串&#xff0c;对应着添加一个labelMap&#xff0c;用于鼠标移上按钮时的提示。1toolbars:[2[...,searchreplace,help,camnpr]3],4labelMap:{5anchor:,u…

junit 单元测试报错java.lang.NoClassDefFoundError

查看版本 junit-4.11以上版本不在包含hamcrest。 解决方法&#xff1a; 下载 junit-4.11以下版本或下载hamcrest-core-1.3.jar驱动包

aps后缀是什么文件_APS审核真的取消了么?

今天早上&#xff0c;留德朋友圈被一条看似惊人的消息刷爆了&#xff1a;APS审核取消了。从早上8点开始&#xff0c;老狗微信的提示音就没有消停过&#xff0c;很多学生抱着同样的问题过来询问&#xff1a;老师&#xff0c;APS是不是真的取消了&#xff1f;我马上爬了起来&…

用计算机探索规律反思,用计算器探索规律教学反思

用计算器探索规律教学反思一:本课时主要引导学生借助计算器探索积得一些变化规律和商不变的规律,以及运用这些规律进行简便计算和解决一些简单的实际问题,在学习这部分内容之前,学生已经学习了整数乘、除法和使用计算器进行计算,有了一定的学习基础.因此,重点应放在对规律的探索…

基于java Springboot实现教务管理系统《视频版-建议收藏》

视频演示&#xff1a; 文末获取源码联系 java Springboot教务管理系统研究背景&#xff1a; 在当今信息社会发展中中&#xff0c;计算机科学的飞速发展&#xff0c;大多数学校开始注意办公效率的发展是很关键&#xff0c;对学校的管理起到举足轻重的作用。基于 Internet 网络的…

c调用python gensim包_Jupyter Notebooks嵌入Excel并使用Python替代VBA宏

以前&#xff0c;Excel和Python Jupyter Notebook之间我们只能选择一个。但是现在随着PyXLL-Jupyter软件包的推出&#xff0c;可以将两者一起使用。在本文中&#xff0c;我将向你展示如何设置在Excel中运行的Jupyter Notebook。在这两者之间共享数据&#xff0c;甚至可以从Exce…

基于java Springboot实现课程评分系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

计划任务列表 html,OpenWrt使用crontab执行计划任务

cron是linux系统主要的调度进程&#xff0c;可以在无人干预的情况下执行命令。crontab命令允许用户编辑、删除、提交相应的作业&#xff0c;每一个用户都可以有 自己的crontab文件来保存调度信息&#xff0c;你可以使用它每隔一小时、每隔一周或者一周三次来执行任意一个Shell脚…

百度-Java中级面试题分享-

BeanFactory 和 ApplicationContext 有什么区别 > BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了种 bean 的定义&#xff0c; 以便在接收到客户端请求时将对应的 bean 实例化。 > BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将 b…

1t硬盘怎么分区最好_win7系统硬盘怎么分区 win7系统硬盘分区步骤【介绍】

我们在使用win7系统的过程当中&#xff0c;经常都会把硬盘分成几个盘&#xff0c;不过因为一些原因&#xff0c;需要把硬盘进行重新分区&#xff0c;不过很多用户都不知道在不重装系统的情况下进行分区&#xff0c;那么win7系统硬盘如何分区呢?今天为大家分享win7系统硬盘分区…

天津计算机专业排名2015,2015年南开大学计算机类专业最低分是多少?

技校网专门为您推荐的类似问题答案问题1&#xff1a;中山大学和南开大学的计算机专业研究生哪个更好考&#xff1f;怎么说呢&#xff0c;中大的计算机有2个学院都有&#xff0c;如果专门做计算&#xff0c;还有数计学院。当然主流是信息与科学技术学院和软件学院&#xff0c;信…

京东-Java中级面试题分享-

1、哪些情况下的对象会被垃圾回收机制处理掉&#xff1f; 利用可达性分析算法&#xff0c;虚拟机会将一些对象定义为 GC Roots&#xff0c;从 GC Roots 出发沿着引用链向下寻找&#xff0c;如果某个对象不能通过 GC Roots 寻找到&#xff0c;虚拟机就认为该对象可以被回收掉。 …

斑能不能彻底去掉_淡妆能不能只用洗面奶卸掉?

淡妆能不能只用洗面奶卸掉?洗面奶能卸妆吗?洗面奶不可以卸妆。洗面奶一般只能清除掉水溶性的污垢,对于油性的彩妆卸效果不大。如果是化妆之后单纯地用洗面奶洁面的话,彩妆不能清除干净容易堵塞毛孔,造成毛孔粗大,皮肤粗糙。卸妆洁面二合一效果的洗面奶能够清除一部分彩妆,但是…