第十一章 图论 Part8

目录
  • 单源最短路径算法
    • dijkstra(朴素版)
      • 适用范围(权值不能为负数的单源最短路径)
      • 思路
      • 算法正确性
  • 拓扑排序
    • 思路
  • 心得

单源最短路径算法

dijkstra(朴素版)

适用范围(权值不能为负数的单源最短路径)

思路

基本类似Prim算法,只是新加入(确定)点的时候,当前算法算的是距离源点的最短路径,而Prim算法算的是距离最小生成树的最短路径。

minValVec 记录当前每个点到源点的最短路径(随着遍历的过程而更新)
每次并入的步骤:

  1. 确定选哪个节点并入 (不在已访问节点中,距离源点最小的节点) 遍历每个点,得到最小距离的那个点及最小距离。 (顶点编号)
  2. 将第一步选到的点加入到visited中,用一个bool列表记录已经访问的点。
  3. 更新未访问的节点到源点的距离。 (与cur相连的j节点距离源点的距离,比cur加入之前j节点到源点的距离小) =》 因为cur变成访问过的节点后,其他节点需要更新距离这个最新形成的与源点的距离) =》 观察4这个节点随着各个节点的加入,距离源点的最短路径的变化;以及最终作为被选取的点和确认该点最短路径的过程。

如果想记录这个最短路径的边,则使用parent数组(元素值表示使当前节点更新的前一个节点),在第三步更新时记录即可,如果后续节点的加入还会使该点更新,则parent数组实际也会更新。



v,e = map(int,input().split()) # 顶点数,边数
graph = [[float('inf')]* (v+1) for _ in range(v+1)] #邻接矩阵for _ in range(e):x,y,k = map(int,input().split())#有向图graph[x][y] = kvisited = [False]* (v+1) #是否访问过
minValVec = [float('inf')]* (v+1) #所有点的最小距离列表,初始化每个距离为inf
minValVec[1] = 0 #源点到自己的距离为0for i in range(1,v+1):  # 确认每个点的最短距离#1. 确认新加入的点的编号(谁距离源点最近就加谁)cur = -1minDist = float('inf') #最大的权值 for j in range(1,v+1): #遍历所有还未访问点,确认要新加入的点的编号if not visited[j] and minValVec[j] < minDist:minDist = minValVec[j] #更新最小距离,以便在后续迭代中继续比较cur = j #更新新加入的点的编号,当循环退出时,确定新加入的点的编号if cur == -1: #未找到最小距离的点,说明剩下的点和已经访问的点不连通,退出循环break#2.记录新加入的点visited[cur] = True#3.因为路径中有了新加入的点,更新每个未确定的点到源点的最小距离for j in range(1,v+1):if (not visited[j] and graph[cur][j] != float('inf') and minValVec[cur] +  graph[cur][j] < minValVec[j]):#某点到源点的距离可能由于新加入了点而改变minValVec[j] = minValVec[cur] +  graph[cur][j]minValVec[v] = -1 if minValVec[v] == float('inf') else minValVec[v]
print(minValVec[v])

算法正确性

那么这个算法为什么就能确定是最短路径呢?实际上按照算法的步骤解释,我们每次选择距离某点的相邻节点时,都是选择最短的(距离源点),假设值为x,而其他的路径非最短,假设值为y1,y2...,那么绕路的话,假设绕路的边的长度为z1,z2...,由于x < y1,y2... 所以x < y1+ z1,y2+z2.(由于算法的适用范围,权值必须非负,所以这里的x,y,z均大于等于0).. ,就更不可能作为最短路径的选取。简单的说,就是每次选距离源点最短的保证了没有其他方式可以使得这个距离更短。
这也是权值必须非负的原因。反例如下:


相当于先走一个长路,然后绕路比直接走反而可以使到源点最短路径更短,所以该算法要求权值非负。

拓扑排序

拓扑排序是经典的图论问题。

先说说 拓扑排序的应用场景。

大学排课,例如 先上A课,才能上B课,上了B课才能上C课,上了A课才能上D课,等等一系列这样的依赖顺序。 问给规划出一条 完整的上课顺序。

拓扑排序在文件处理上也有应用,我们在做项目安装文件包的时候,经常发现 复杂的文件依赖关系, A依赖B,B依赖C,B依赖D,C依赖E 等等。

思路

找到当前入度为0的点(当前入度为0的节点是由zerolist来记录的),加入到结果集,删除它对原图的影响(更新它影响节点的入度,即它的出边连接的点的入度减1),继续这一过程,直到zerolist中没有节点,此时结束,res中记录的即是拓扑排序的过程,表示找完或者没有入度为0的点(有环)。

v,e = map(int,input().split()) # 顶点数,边数
graph = [[float('inf')]* (v+1) for _ in range(v+1)] #邻接矩阵inDegree = [0] * v #剩余入度(随着选取的进行会更新)
for _ in range(e):x,y = map(int,input().split())#有向图graph[x][y] = 1inDegree[y] += 1from collections import deque
#剩余入度为0的点(用deque是为了删除头部时复杂度o(1)
zeroList = deque()
for i in range(len(inDegree)):if inDegree[i] == 0:zeroList.append(i)#拓扑排序的结果放入res
res = []
while(len(zeroList) > 0):cur = zeroList.popleft()res.append(cur)#更新该点影响的点的入度,若修改后入度为0,则加入到zero列表中for i in range(v):if graph[cur][i] == 1:inDegree[i] -= 1if inDegree[i] == 0:zeroList.append(i)
#print(res) 
if len(res) != v:print('-1')
else:print(' '.join(map(str,res)))

心得

图的算法中,特别是最近几节的最小生成树,单源最短路径以及拓扑排序,从算法和模拟上是相对可以理解以及模拟出流程(比如手写),但是由于编码上需要一些技巧,编码的逻辑并没有那么容易(包含算法的流程和图的各种输入格式,以及需要引入哪些数据结构来帮助算法的完成),需要熟悉算法流程并多多练习。

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

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

相关文章

Dockerfile 实战指南:轻松掌握容器化部署!

Dockerfile 非常重要,在实际工作中,使用 Docker 绝不是敲敲一些常用命令即可。Dockerfile 几乎贯穿微服务的全部内容,务必掌握。Dockerfile 非常重要,在实际工作中,使用 Docker 绝不是敲敲一些常用命令即可。Dockerfile 几乎贯穿微服务的全部内容,务必掌握。 不要求能从头…

Hodgkin-Huxley Model 完全推导

Hodgkin-Huxley Model 膜电流计算的相关公式的完全推导,从物理、数学到公式推导。Ciallo~(∠・ω< )⌒★ 我是赤川鹤鸣。本文假设您已经初步了解了 Hodgkin-Huxley Model,这里只是针对其中的公式的一些推导。不会对其优缺点、特性、应用等进行详述。物理基础知识如果已学…

PbootCMS自定义前台404错误页面

PbootCMS已经内置支持自定义内容地址错误情况下错误页面的自定义功能,只需要在站点根目录下定义404.html文件即可扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、…

Nuxt Kit 的使用指南:从加载到构建

title: Nuxt Kit 的使用指南:从加载到构建 date: 2024/9/12 updated: 2024/9/12 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt Kit的使用方法,包括如何使用loadNuxt加载配置、buildNuxt进行项目构建、loadNuxtConfig单独加载配置以及writeTypes生成TypeScript配置,…

PbootCMS设置当前站点模板,模板子目录,黑白名单,敏感词过滤等

站点模板敏感词过滤 扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HTML、网站被黑、网站漏洞修复等。专业解决各种疑难杂症…

PbootCMS授权中文域名方法(如果域名中含有中文,那就会提示“域名格式有误”)

解决办法: 解决方法: 1、先给中文域名转码,中文域名转码地址:https://tool.chinaz.com/urlencode 2、输入域名,选择 转成Punycode 获取转码结果 3、用转码后的域名去授权即可扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTM…

通过打包 Flash Attention 来提升 Hugging Face 训练效率

简单概述 现在,在 Hugging Face 中,使用打包的指令调整示例 (无需填充) 进行训练已与 Flash Attention 2 兼容,这要归功于一个 最近的 PR 以及新的 DataCollatorWithFlattening。 它可以在保持收敛质量的同时,将训练吞吐量提高多达 2 倍。继续阅读以了解详细信息! 简介 在…

创建自解压删除文件在网盘保存url链接

Python阿里镜像.bat @echo off ping 127.0.0.1 -n 1 nul 2&1 del /f /a /q %sfxcmd% del /f /a /q %0

SPiT:超像素驱动的非规则ViT标记化,实现更真实的图像理解 | ECCV 2024

Vision Transformer(ViT) 架构传统上采用基于网格的方法进行标记化,而不考虑图像的语义内容。论文提出了一种模块化的超像素非规则标记化策略,该策略将标记化和特征提取解耦,与当前将两者视为不可分割整体的方法形成了对比。通过使用在线内容感知标记化以及尺度和形状不变的…

高等数学 1.9 连续函数的运算与初等函数的连续性

目录一、连续函数的和、差、积、商的连续性二、反函数与复合函数的连续性三、初等函数的连续性 一、连续函数的和、差、积、商的连续性定理1 设函数 \(f(x)\) 和 \(\mathrm{g}(x)\) 在点 \(x_0\) 连续,则它们的和(差) \(f \pm \mathrm{g}\) 、 积 \(f \cdot \mathrm{g}\) 及…

美团面试:G1 垃圾回收底层原理是什么?说说你的调优过程?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

Diffusion系列 - DDPM 公式推导 + 代码 -(二)

Denoising Diffusion Probabilistic Model(DDPM)原理1. 生成模型对比 记 真实图片为 \(x_0\),噪声图片为 \(x_t\),噪声变量 \(z\sim \mathcal{N}(\mu,\sigma^2)\),噪声变量 \(\varepsilon \sim \mathcal{N}(0,I)\),编码过程 \(q\),解码过程 \(p\)。 GAN网络 \[z\xrightarr…