【贪心】单源最短路径Python实现

文章目录

    • @[toc]
      • 问题描述
      • `Dijkstra`算法
      • `Dijkstra`算法应用示例
      • 时间复杂性
      • `Python`实现

个人主页:丷从心

系列专栏:贪心算法

从心


问题描述

  • 给定一个带权有向图 G = ( V , E ) G = (V , E) G=(V,E),其中每条边的权是非负实数,给定 V V V中的一个顶点,称为源
  • 计算从源到所有其他各顶点的最短路长度

Dijkstra算法

  • Dijkstra算法是解单源最短路径问题的一个贪心算法
  • 其基本思想是,设置顶点集合 S S S,并不断地做贪心选择来扩充这个集合,一个顶点属于集合 S S S当且仅当从源到该顶点地最短路径长度已知
  • 初始时, S S S中仅含有源,设 u u u G G G的某一个顶点,把从源到 u u u且中间只经过 S S S中顶点的路称为从源到 u u u的特殊路径,并用数组 d i s t dist dist记录当前每个顶点所对应的最短特殊路径长度,用列表parent[i]记录从源到顶点 i i i的最短路径上 i i i的前一个顶点
  • Dijkstra算法每次从 V − S V - S VS中取出具有最短特殊路长度的顶点 u u u,将 u u u添加到 S S S中,同时对列表distparent做必要的修改,当dist[u] + graph[u][i] < dist[i] 时,置dist[i] = dist[u] + graph[u][i],置parent[i] = u
  • 一旦 S S S包含了所有 V V V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度

Dijkstra算法应用示例

  • 对下图中的有向图,应用Dijkstra算法计算从源顶点 1 1 1到其他顶点间最短路径的过程如下表所示

1

迭代 S S S u u u d i s t [ 2 ] dist[2] dist[2] d i s t [ 3 ] dist[3] dist[3] d i s t [ 4 ] dist[4] dist[4] d i s t [ 5 ] dist[5] dist[5]
初始 { 1 } \set{1} {1} − - 10 10 10 m a x i n t maxint maxint 30 30 30 100 100 100
1 1 1 { 1 , 2 } \set{1 , 2} {1,2} 2 2 2 10 10 10 60 60 60 30 30 30 100 100 100
2 2 2 { 1 , 2 , 3 } \set{1 , 2 , 3} {1,2,3} 4 4 4 10 10 10 50 50 50 30 30 30 90 90 90
3 3 3 { 1 , 2 , 4 , 3 } \set{1 , 2 , 4 , 3} {1,2,4,3} 3 3 3 10 10 10 50 50 50 30 30 30 60 60 60
4 4 4 { 1 , 2 , 4 , 3 , 5 } \set{1 , 2 , 4 , 3 , 5} {1,2,4,3,5} 5 5 5 10 10 10 50 50 50 30 30 30 60 60 60

时间复杂性

  • 对于一个具有 n n n个顶点的带权有向图,Dijkstra算法进行二重循环,需要 O ( n 2 ) O(n^{2}) O(n2)时间

Python实现

import sysclass Graph:def __init__(self, vertices):self.V = verticesself.graph = [[0 for _ in range(vertices)] for _ in range(vertices)]def printSolution(self, dist, parent):for v in range(self.V):path = []curr = vwhile curr != -1:path.append(curr)curr = parent[curr]path.reverse()print((v, dist[v], path))def minDistance(self, dist, sptSet):min_value = sys.maxsizemin_index = -1for v in range(self.V):if dist[v] < min_value and not sptSet[v]:min_value = dist[v]min_index = vreturn min_indexdef dijkstra(self, src):dist = [sys.maxsize] * self.Vdist[src] = 0sptSet = [False] * self.Vparent = [-1] * self.Vfor _ in range(self.V):u = self.minDistance(dist, sptSet)sptSet[u] = Truefor v in range(self.V):if self.graph[u][v] != 0 and 0 < dist[u] + self.graph[u][v] < dist[v] and not sptSet[v]:dist[v] = dist[u] + self.graph[u][v]parent[v] = uself.printSolution(dist, parent)g = Graph(9)
g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0],[4, 0, 8, 0, 0, 0, 0, 11, 0],[0, 8, 0, 7, 0, 4, 0, 0, 2],[0, 0, 7, 0, 9, 14, 0, 0, 0],[0, 0, 0, 9, 0, 10, 0, 0, 0],[0, 0, 4, 14, 10, 0, 2, 0, 0],[0, 0, 0, 0, 0, 2, 0, 1, 6],[8, 11, 0, 0, 0, 0, 1, 0, 7],[0, 0, 2, 0, 0, 0, 6, 7, 0]]
src = 0print(f'(顶点, 以顶点 {src} 为源的最短路径长度, 最短路径)')
print('-' * 40)g.dijkstra(src)print('-' * 40)
(顶点, 以顶点 0 为源的最短路径长度, 最短路径)
----------------------------------------
(0, 0, [0])
(1, 4, [0, 1])
(2, 12, [0, 1, 2])
(3, 19, [0, 1, 2, 3])
(4, 21, [0, 7, 6, 5, 4])
(5, 11, [0, 7, 6, 5])
(6, 9, [0, 7, 6])
(7, 8, [0, 7])
(8, 14, [0, 1, 2, 8])
----------------------------------------

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

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

相关文章

指南:在App Store Connect上编辑多个用户的访问权限

作为一名编程新手&#xff0c;在App Store Connect中管理用户权限可能初听起来有些复杂&#xff0c;但实际上它是一个相对直接的过程。这里是一个步骤清晰的指南来帮助您在App Store Connect上编辑多个用户的访问权限。 App Store Connect 简介 在开始之前&#xff0c;让我们…

Openwrt AP 发射 WiFi 信号

问题 想一次把 OpenWrt 路由器 wifi 问题给解决&#xff0c;完全取代路由器。 使用 倍控的 N5105 设备&#xff0c;有 mPCIe 接口&#xff0c;使用了 intel AX200 无线网卡&#xff0c;支持 2.4G 与 5G。 设置步骤 OpenWrt 镜像 第一次使用的镜像不支持 wifi&#xff0c;在…

“抓取再吸取的连续操作学习”研究工作发表于IEEE Trans. on Robotics:仿人手的柔性抓取,超人手的指背吸取!

长期以来&#xff0c;抓取一直被认为是机器人操作中一项重要而实际的任务。然而&#xff0c;实现对不同物体的稳健和有效的抓取具有挑战性&#xff0c;因为它涉及夹具设计、感知、控制和学习等。最近基于学习的方法在抓取各种新物体方面表现出优异的性能。然而&#xff0c;这些…

【C++11特性篇】新的类功能解读:新增加的[移动构造函数/移动赋值运算符重载]

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 &#xff08;一&#xff09;” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

Github 2023-12-24 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-24统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5Jupyter Notebook项目2C项目1C项目1Go项目1Java项目1JavaScript项目1Ruby项目1 Serverless Frame…

双向长短期记忆网络(Bi-LSTM)-多输入回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整代码下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编…

vscode配置用户代码片段

1.左下角打开设置 2.新建全局代码片段 3.输入名字&#xff0c;名字随意不过最好语意化 4.创建模版 这里的模版为vue2常用代码片段&#xff0c;稍后会持续更新。 {"Print to console": {"prefix": "v2", //页面使用时名称"body":…

LeNet网络分析与demo实例

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 网络分析&#xff1a; 最好是把这个图像和代码对着来看然后进行分析的时候比较快 # 使用torch.nn包来构建神经网络. im…

Go 泛型之类型参数

Go 泛型之类型参数 文章目录 Go 泛型之类型参数一、Go 的泛型与其他主流编程语言的泛型差异二、返回切片中值最大的元素三、类型参数&#xff08;type parameters&#xff09;四、泛型函数3.1 泛型函数的结构3.2 调用泛型函数3.3 泛型函数实例化&#xff08;instantiation&…

WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER.

Hadoop启动时警告&#xff0c;但不影响使用&#xff0c;强迫症的我还是决定寻找解决办法 WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.原因是Hadoop安装配置于root用户下&#xff0c;对文件需要进…

案例144:基于微信小程序的自修室预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Spring中的上下文工具你写的可能有bug

文章目录 前言功能第一种&#xff1a;ApplicationContext第二种方式&#xff1a;ApplicationContextAware第三种&#xff1a;BeanFactoryPostProcessor 源码第一种第二种第三种 前言 本篇是针对如何写一个比较好的spring工具的一个探讨。 功能 下面三种方式&#xff0c;你觉…

Odoo16 实用功能之Form视图详解(表单视图)

目录 1、什么是Form视图 2、Form视图的结构 3、源码示例 1、什么是Form视图 Form视图是用于查看和编辑数据库记录的界面。每个数据库模型在Odoo中都有一个Form视图&#xff0c;用于显示该模型的数据。Form视图提供了一个可编辑的界面&#xff0c;允许用户查看和修改数据库记…

[python]用python实现对arxml文件的操作

目录 关键词平台说明一、背景二、方法2.1 库2.2 code 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 一、背景 有时候需要批量处理arxml文件(ARXML 文件符合 AUTOSAR 4.0 标准)&#xff0c;但是工作量太大&#xff0c;阔以考虑用python。 二、方…

最新版 JESD79-5B,2022年,JEDEC 内存SDRAM规范

本标准定义了DDR5 SDRAM规范&#xff0c;包括特性、功能、交流和直流特性、封装以及球/信号分配。本标准旨在为x4、x8和x16 DDR5 SDRAM设备定义符合JEDEC标准的8 Gb至32 Gb的最低要求。该标准是基于DDR4标准&#xff08;JESD79-4&#xff09;和DDR、DDR2、DDR3和LPDDR4标准的一…

智能优化算法应用:基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.…

1856_emacs_calc使用介绍与故事

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 1856_emacs_calc使用介绍与故事 calc是emacs内置的一个计算器&#xff0c;可以提供多种计算表达方式并且可以支持org-mode中的表格功能。 主题由来介绍 我是因为想要了解org-…

采草(动态规划)

先说说我的思路吧 下面是部分聊天记录 赤坂 龍之介 2023/12/22 11:06:04 就像我之前说的那样&#xff0c;我把每一个药草的价值除以时间&#xff0c;得出了新的价值评估标准&#xff1a;采摘这个药草时&#xff0c;每分钟的价值 赤坂 龍之介 2023/12/22 11:07:00 然后排…

2023年小型计算机视觉总结

在过去的十年中&#xff0c;出现了许多涉及计算机视觉(CV)的项目&#xff0c;无论是小型的概念验证项目还是更大规模的生产应用。应用计算机视觉的方法是相当标准化的: 1、定义问题(分类、检测、跟踪、分割)、输入数据(图片的大小和类型、视野)和类别(正是我们想要的) 2、注释…