学渣都能看懂的-单源无权最短路问题(广度优先搜索算法)

无权最短路 题目描述 给定无权无向图G(V,E)和源点s/终点t,求s->t的最短路径。 假设读入边的列表是有(字典)序的(既邻接表就是有序的)。 输入格式 第一行包含4个整数N、M、s、t(N≤5000,M≤200000),表示该图共有N个结点和M条无向边。起点为s,终点为t。 接下来M行,每行包含2个整数{u,v},表示有一条无向边连接结点u、v。 输出格式 输出最短路的长度。 若无法到达,输出"No path"(不含引号)。 样例输入 4 3 1 ... 阅读详情

单源无权最短路问题所要掌握的点:
·求出图中源点到达图中任意顶点的所有路径中最短的路径的长度
·求出图中源点到达图中任意顶点的所有路径中最短的路径的走法

由于图无权(或者称权为1),所以离源点的距离越大,路径长度越长,所以解决单源无权最短路问题只需求出源点到任意某点的所有路径中所要经过其它中间点的数量最少的路径。
(源点为点1。到点3有两条路径1→2→3 和 1→3,第1条路径经过1个中间点,第2条路径不经过中间点,故点1到点3的最短路径为1→3)
(源点为点1。到点3有两条路径1→2→3 和 1→3,第1条路径经过1个中间点,第2条路径不经过中间点,故点1到点3的最短路径为1→3)

我们可以先确定中间点有0个的点(路径长度为1的点),这些点路径长度为1的作为1个中间点,再去确定中间点有1个的点(路径长度为2的点),再将这些路径长度为2的点去确定中间点有2个的点(路径长度为3的点),循环往复,最终确定路径长度最长的点。
在这里插入图片描述
(源点为点1。先确定2、3两点路径为1,再通过点3确定点4路径为2)

这种路径的寻找方式可使用在树的遍历与图的遍历中所学到广度优先搜索BFS(如果没学过建议先去打基础,不要跳着学)。
(层序遍历代码与单源无权最短路代码比较)
(层序遍历代码与单源无权最短路代码比较)

我们需要定义dist数组储存路径长度,path数组储存其路径上的前一个点,并且让path数组兼具visited数组的判断顶点是否已经被游览过的功能。若要输出源点到某点的路径,可用栈压入后弹出输出或者用递归算法。

#include<stdio.h>
typedef int ElementType;//int中可改为所需要的数据类型
int v[100][100],path[100],dist[100];/*v[100][100]为邻接矩阵,path[100]储存其路径上的前一个点,
dist[100]储存路径长度,并且判断顶点是否已被游览*/
ElementType vdata[100];//有需要可添加顶点数据,这里简化问题,不输入顶点数据
int queue[100], head = 0, tail = 0;//层序遍历的队列
int main()
{
	int vnum, arcnum;//vnum为顶点数,arcnum为边数
	scanf_s("%d %d", &vnum, &arcnum);
	for (int i = 1; i <= vnum; i++)//由于dist数组兼具判断顶点是否已被游览的功能,所以要将其初始化为一个不可能的定值
		dist[i] = -1;

	int v1, v2;
	/*储存边的两个顶点,若输入的是顶点数据data,则需另设一个search函数找到顶点的序号。
	这里简化问题,直接给顶点序号*/
	for (int i = 1; i <= arcnum; i++)//输入边
	{
		scanf_s("%d %d", &v1, &v2);
		v[v1][v2] = 1;
		v[v2][v1] = 1;
	}

	queue[tail++] = 1; dist[1] = 0; path[1] = 1;//源点进队列,路径长度初始化为0,路径上前一顶点初始化为该源点的位置
	int vpop;//储存出队列的顶点
	while (head != tail)//判断队列是否为空,以判断所有顶点是否全部被游览过
	{
		vpop = queue[head++];//出队列
		for (int i = 1; i <= vnum; i++)
		{
			if (v[vpop][i] && dist[i] == -1)//存在边且未被读过
			{
				queue[tail++] = i;//进队列
				dist[i] = dist[vpop] + 1;//该顶点路径长度为前一顶点路径长度+1
				path[i] = vpop;//该顶点前一顶点为其路径前一点
			}
		}
	}
//以下代码为测试代码
	for (int i = 1; i <= vnum; i++)//输出队列长度
		printf("%d ",dist[i]);
	printf("\n");
	for (int i = 1; i <= vnum; i++)//输出顶点路径上的前一顶点
		printf("%d ", path[i]);
}

推荐免费课程:浙江大学-数据结构-无权图的单源最短路径(看完需要约10分钟,可倍数播放)

BFS求无权无向图最短路 BFS求最短路 假设有一个n行m列网格迷宫,每个宫格要么可以走要么不可以走,设置一个起点和一个终点,如何求起点到终点的最短路径?(图片来自网上) 我们知道BFS广度优先搜索就是按照距离根节点距离从小到大的顺序搜索,因此利用BFS逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点,最终将生成一颗以起点为根的BFS树。此时BFS可以求出任意一点到起点的最短距离 下面代码假设起点在(... 阅读详情

相关推荐

数据结构——14.1 最短路1

首先访问离源点距离为1的顶点,然后是距离为2的顶点,以此类推。这天然地保证了第一次到达某个顶点时,所经过的路径就是最短的。SPFA 是 Bellman-Ford 的队列优化版本,在大多数情况下比 Bellman-Ford 更高效。当图中所有边的权重都相同时(例如都为1),求最短路就等价于求经过边数最少的路径。值刚刚变小的顶点,才有可能去更新它们的邻接点。因为它的贪心策略(每次选最近的)在负权边存在时不再成立。条边,因此一定能找到所有可达顶点的最短路。的单源最短路问题的经典贪心算法。

Rhett_Butler0922的博客 857

洛谷 1144 最短路计数(无权图最短路)

由题意得,这是一个无向图,且N(顶点的数量)和M(边的数量)的数据范围很大。这里可以将一条无向边拆成两条有向边(如:x,y之间有一条边,储存为x到y有一条边,y到x有一条边),用f数组(f[i]表示顶点i关联的最新的一条边)和结构体b数组(from,to,next)储存。重边是要被重复计算的,也就是点j的最短路可以由dl数组中多个点抵达,同时也可以由i点(dl中的点)的多条边抵达,只要调整bj[j]=1的位置以及引入“临时标记”dj即可。(详情见代码及注释)储存dl数组的点,层层遍历,更新dl数组的点。

2302_76169191的博客 552

【知识点】图论续篇 - 最短路算法合集

最短路算法,见名知意,就是用于求出图中从某个顶点到另一个顶点最短距离的算法。最短路算法的应用极其广泛。本文将会以求解最短路为中心,围绕着展开叙述一些常见的最短路算法的原理和应用。

Macw07的博客 2069

数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

在算法的每一步,我们将一个顶点加入集合S,该顶点是在当前阶段中距离源点s的最短路径长度最小的顶点。Floyd算法也是逐步地求出最短距离的,通过遍历所有可能的中间节点k,并不断尝试更新D[i][j]的值,Floyd算法逐步优化路径长度,最终找到图中所有节点对之间的最短路径。现在,我们引入一个中间节点k,想要通过节点k来尝试找到更短的路径,即尝试在节点i和节点j之间建立一条路径,其中包括节点k。在每一步中,选择的顶点v是当前阶段中距离源点s最近的顶点,而且该距离是经过已确定最短路径顶点集合S的路径长度。

li13437542099的博客 4575

【R语言】富集分析可视化代码(整理版)

分别介绍了如何使用DAVID在线分析工具对基因进行GO/KEGG功能富集分析、使用R ggplot包对获得的基因GO/KEGG功能富集结果进行可视化、使用R clusterProfiler包和R AnnotationHub包对基因进行GO/KEGG功能富集分析、OrgDb包制作以及结果可视化等。故,我重新整理了一波,并补充了可对多个分组的富集结果进行可视化以及富集结果绘制圈图等的代码。关注“在打豆豆的小潘学长”公众号,发送“富集分析3”获得完整代码包和演示数据。一、单组富集结果可视化。

weixin_54004950的博客 1万+

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 90

最短路径算法

开始自己也不知道广度优先算法与Dijkstra算法的区别,广度优先是先将未访问的邻居压入队列,再将未访问邻居的未访问过的邻居压入队列再依次访问,Dijkstra是在剩余的未访问过的顶点中找出最小的并访问,循环做这个是直到所有点都被访问完!那么我以前就遇到了一个问题,一个题我用bfs辛辛苦苦100多行码出来了,别的大佬用dijkstra轻松写出来了,虽然码量就比我少了二三十行,但是我心中一直没分清bfs,dfs,dijkstra,floyd和Spfa的区别。先搜索邻居,搜完邻居再搜邻居的邻居。

欢迎来到“曲终酣兴晚^R”的博客~ 709

信贷风控分析—征信数据源

详解企业和个人征信报告,以及信贷风控之指标构造案例参考

csdnbt的博客 3641

【数据结构笔记24】单源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

有权图的单源最短路使用的Dijkstra算法,多源最短路算法使用的Floyd算法。

记录学习痕迹的公众号:Piper蛋窝 1558

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

简单光学 2035

别再只接个放大器了!压电传感器测量电路(电压/电荷放大器)的5个实战配置要点

本文深入解析压电传感器测量电路中的5个关键实战配置要点,包括电缆长度选择、输入阻抗匹配、过载保护设计、低频噪声抑制及放大器选型策略。特别针对电压放大器和电荷放大器的应用场景差异提供工程实践建议,帮助工程师有效解决信号失真、噪声干扰等常见问题,提升测量精度和系统可靠性。

weixin_26869081的博客 302

【算法】Dijkstra 算法解决单源最短路问题

本文介绍了图论中的最短路算法基础,包括边权、稠密图与稀疏图概念,以及邻接矩阵和邻接表的存储方式。重点对比了BFS和Dijkstra算法:BFS适用于无权图,通过队列实现;Dijkstra适用于边权非负的带权图,使用优先队列贪心地选择最小花费路径。通过1091题示例展示了两种算法的实现差异,并分析了Dijkstra通过维护cost数组避免成环的核心机制。最后总结了两种算法在适用场景、数据结构和距离定义上的关键区别。

2401_87853595的博客 762

UE4项目迁移指南:如何无缝导入外部.uasset文件并保持材质关联

本文详细解析了将外部.uasset文件无缝导入UE4项目的专业方法。针对手动复制文件时常见的材质关联丢失问题,提供了使用引用查看器进行诊断和修复的实用技巧,并推荐使用引擎内置的“迁移”功能确保资源依赖关系的完整性,帮助开发者高效整合项目资源。

t8u9v0的博客 1046

学不会最短路问题?看这篇就够了

时间复杂度:(O((|V| + |E|) \log |V|)) 取决于实现方式,常用优先队列来优化顶点的选择。问:图的顶点从0开始编号,而本题目中动物从1开始编号。这个图我如果不停的循环,每圈赚5块,那无限转圈不就反而倒赚正无穷(美好的愿望hh)图里面要是有这样一种负值圈的话,基本上所有的算法都会挂掉,所有后面不考虑这种情况。基于贪心策略,逐步将顶点加入到集合 (S),并更新其到其他顶点的最短路径。算法相通之处:按照递增(非递减)的顺序找出到各个顶点的最短路。由图得知从红色的位置到绿色的最短路径是哪条?

Rockivy的博客 4330

第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门

vben5 快速入门。 Vben Admin 框架新出的版本V5.5.4,而之前的Vben Admin 2.x 目前已存档,仅进行重大问题修复。之前在2.x版本曾经简单完成了一版专栏文章,当时也是收获了一些好评和建议。本次决定在v5 版本基础上再完成一次前后端的搭建。希望大家继续多多支持。项目精简后,再次启动项目,执行 pnpm run dev点击登录,可以看到接口报错,现在前端请求的后端有报错,下一节处理这部分逻辑。

cuiwin的专栏 7074

本地构建AI智能分析助手之 05 PandasAI如何MySQL数据库 (教程含源码)

与 PostgreSQL 连接器类似,MySQL 连接器允许您连接到 MySQL 数据库。即使您不熟悉 MySQL 或 PandasAI,它也设计得易于使用。

iCloudEnd的博客 703

BFS:解决多源最短路问题

多源最短路问题(Multi-Source Shortest Path Problem,MSSP)是图论中的一个经典问题,它的目标是在给定图中找到从多个源点到所有其他顶点的最短路径。这个问题可以视为单源最短路问题(Single-Source Shortest Path Problem, SSSP)的扩展。什么是单源最短路问题呢?

2301_79969994的博客 2346

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

图论5 单源无权最短路径

本文介绍了使用广度优先搜索(BFS)算法解决单源无权最短路径问题的方法。BFS通过层级遍历图结构,确保最先找到的路径即为最短路径。算法采用队列管理待访问顶点,时间复杂度为O(V+E)。文章详细阐述了算法步骤,包括初始化、距离标记和路径追踪,并提供了完整的Java实现代码,包含顶点类定义、路径计算和重构等功能。通过校园地图的测试案例,验证了算法能正确计算从源点到各顶点的最短路径。该算法在网络路由、社交分析等领域具有重要应用价值。

道可道非常道 1049

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

算法魅力-BFS解决多源最短路

在图论与网格问题中,最常见的一类题目就是“求最短距离”。通常情况下,我们会从某一个起点出发,利用 BFS(广度优先搜索) 逐层扩展,得到从该点到所有点的最短路。然而,在许多实际场景中,往往存在 多个起点:例如从多个水源扩展到所有陆地、从多个火源蔓延到整个森林,或者像 LeetCode 1162. 地图分析中,从所有陆地出发,计算到最远海洋的距离。这类问题的核心思想就是 BFS 多源最短路。它与单源 BFS 不同的地方在于:将所有起点一开始就同时加入队列,作为 BFS 的第一层;

2302_79376097的博客 1995

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最短路径算法之一:单源无权图,python实现

在图论中,有一类经典问题,就是最短路径问题。最短路径问题,又分为:单源无权图最短路径问题,单源有权图最短路径问题,多源有权图最短路径问题

不完美的红烧肉的博客 1006

邻接表存储 - 无权图的单源最短路算法

邻接表存储 - 无权图的单源最短路算法 关于邻接表的初始化以及插入边的函数,参考之前的博客,点此处跳转,图的邻接表表示法! 此算法包含最短路算法以及路径存储、最短长度、最短路径打印。 参考代码: #include <cstdio> #include <string> #include <stack> #include <queue> #include...

小牛的博客 419

图最短路问题

一、图的最短路问题分类 求解最短路问题有很多种解决方案,各个方案会有对应的解决类型 单源最短路问题:BFS用于解决单源无权最短路问题 Dijkstra算法用于解决单源正权最短路问题 Bellman-Ford、SPFA算法用于解决负权最短路问题 各顶点最短路问题:Floyd算法 二、BFS广度优先搜索 1、BFS按照到源点的最短距离将图中的各点分类,按照距离从小到大访问各点。为了实现按距离大小访问各...

qq_43575926的博客 892

算法学习(22)—— BFS解决最短路问题

为什么第一次碰到终点时就可以宣布找到最短路了呢?: 感性理解下,A点到I点有4条路,假设有4个速度相同的人同时从起点A出发,由于速度相同,单位时间内可以看作4个人的移动距离是相同的,所以在这种情况下,谁先到达终点,那么这个人所花费的时间就是最少的,所以这个人走的这条路就是最短的:如何找出最短路的长度呢?: 由于权值为1,所有路径的长度都是相同的,所以扩展的层数再乘以权值就是最短路的长度。

aaqq800520的博客 1322

单源无权最短路径

由于在循环过程中,不断地考察了一些已知的顶点和一些已经处理过的未知顶点,所以算法的效率较低。我们可以参考拓扑排序的改进来对这个算法进行改进,我们希望在处理当前定点后处理那些未知的并且距离已经赋值的顶点,而不对已知的或是未被处理过的顶点进行考察,所以可以使用一个队列来存放将要被处理的顶点。到此就得到了所有顶点的最短无权路径,这种搜索一个图的方法称为广度优先搜索,这种方法按照层处理顶点,首先处理输入顶点的邻接顶点,再处理邻接顶点的邻接顶点,很像树的层序遍历。距离为1的顶点,这些顶点可以通过考察。

thdwx的博客 884

无权图的单源最短路算法

思路是广度优先搜索,每次记录路径和距离#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;math.h&gt; #include

xutian_curry的博客 727

无权图最短路:为什么用 BFS(附伪代码与 DFS 对比)

顶点部分每个顶点最多入队一次、出队一次,因此与顶点相关的操作是 O(V)。边部分有向图:每条边 (u,v) 只出现在 Adj[u] 中一次,而 u 在 BFS 中只会出队一次,所以这条边只被枚举一次。无向图:每条无向边 {u,v} 会被存为两条有向边 (u -> v) 和 (v -> u),枚举时各被访问一次,总共两次。因此所有边被枚举的总次数与 E 同阶,总时间复杂度为OVEO(V + E)OVEBFS 是天然合适的算法,复杂度 O(V+E),实现简单;普通 DFS。

六六哥的博客 1267
下一篇: 学渣都能看懂的-最小生成树Prim算法(普里姆算法)
third_gold
博客等级 码龄7年 72粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值