BFS:解决多源最短路问题

文章目录

  • 什么是多源最短路问题?
  • 1.矩阵
  • 2.飞地的数量
  • 3.地图的最高点
  • 4.地图分析
  • 总结

在这里插入图片描述

什么是多源最短路问题?

多源最短路问题(Multi-Source Shortest Path Problem,MSSP)是图论中的一个经典问题,它的目标是在给定图中找到从多个源点到所有其他顶点的最短路径。这个问题可以视为单源最短路问题(Single-Source Shortest Path Problem, SSSP)的扩展。
什么是单源最短路问题呢?其实我们上次讲的就可以归结在单元最短路问题当中,其实单源最短路问题就是只有一个起点对应一个终点,求最短路径,而多源最短路问题则是多个起点,对应一个终点,求这多个起点到达终点的最短路径,那这种题我们该怎么做呢?
第一种做法就是将多源最短路问题转换为n个单源最短路问题,循环n次就解决了,但是这种做法是非常慢的。
第二种做法就是把多个节点看成一个整体进行一次单源最短路问题的解法。
这是单源最短路问题问题:
在这里插入图片描述
多源最短路问题:
在这里插入图片描述
我们可以将多源最短路问题的节点看成一个整体,这种方法不仅在计算机领域很常用,在物理数学也很常用,这种方法叫隔离法,我们可以忽略每个节点之间的差异省去了我们比较每个节点差异的过程。

1.矩阵

题目链接
题目:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题大致的意思就是对一个矩阵做变化,这个矩阵中的数只有两种,一种是1一种是0,我们该如何变换呢?根据题意,变换后节点的值为当前节点的值离最近一个0的节点的距离。按照这个规律首先我们来看看下面的例子,首先零肯定是不会变的,因为零距离最近的零就是他本身,所以这里距离就是0,第二行的1距离最近的零很显然是上左右的零,距离都是1,第三行的1距离醉经的0是上面的0距离为1,但是第三行中间的零距离最近的零是2.
在这里插入图片描述

算法原理:
这里我们已经讲过了做这种题的模式,我们只需要先将所有的零全入到队列中,这些零看成一个整体,在入队列的过程中顺便可以把需要返回的distance数组初始化为-1,然后零的对应位置赋值为0,这里我们直接利用单元最短路向外广搜,也就是整体向外扩散。
在这里插入图片描述
这里红色部分表示我们第一次入进去的0,蓝色部分表示我们第一次扩散,第一次扩散出来的部分应该填1,然后接下来可以继续向外扩散,这里就不展示了。

代码展示:

class Solution {
public:typedef pair<int, int> PII;int dx[4] = { 0,0,1,-1 };int dy[4] = { 1,-1,0,0 };vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {int m = mat.size();int n = mat[0].size();vector<vector<int>> distance(m, vector<int>(n, -1));queue<PII> q;for (int i = 0;i < m;i++){for (int j = 0;j < n;j++){if (mat[i][j] == 0){q.push({ i,j });distance[i][j] = 0;}}}while (q.size()){auto [a, b] = q.front();q.pop();for (int i = 0;i < 4;i++){int x = a + dx[i];int y = b + dy[i];if (x >= 0 && x < m && y >= 0 && y < n&& distance[x][y] == -1){distance[x][y] = distance[a][b] + 1;q.push({ x,y });}}}return distance;}
};

2.飞地的数量

题目链接
题目:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题的大致意思就是让我们找于边界不联通的1的部分,可以看见第一个例子中的1于外界联通,所以这个1不是最终结果,示例1的三个1周围都是1,1代表海洋,所以这三个1和外界不联通所以这三个1是合法的1,返回这三个1,就是返回3.
算法原理:
在这里插入图片描述
上面这个例子红色代表边界上的与外界相连的1,蓝色代表周围都是0的1,这个例子很显然是返回1的,但是如果我们正面做的话很难,因为我们不知道它是否是与外界相连的,只有把这个岛屿遍历完了才知道是与外界相连的,所以这道题我们正难则反找中间的岛屿不好找,我们直接先把与外界相连的岛屿给标记了,然后对这个二维数组遍历一遍,返回没有被标记过的1的个数。这里具体一点就是对这个二维数组最外面的一层用一次多源BFS,先把所有在外面的1入进队列中,然后并标记,表示这个1已经被访问过了,并且不是内部的岛屿,然后再遍历一遍数组,找到没有被标记的1的个数。
代码展示:

class Solution 
{
public:typedef pair<int,int> PII;bool vis[501][501];int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int m,n;int numEnclaves(vector<vector<int>>& grid) {queue<PII> q;m=grid.size();n=grid[0].size();for(int i=0;i<m;i++){if(grid[i][0]==1){q.push({i,0});vis[i][0]=true;}if(grid[i][n-1]==1){q.push({i,n-1});vis[i][n-1]=true;}}for(int i=0;i<n;i++){if(grid[0][i]==1){q.push({0,i});vis[0][i]=true;}if(grid[m-1][i]==1){q.push({m-1,i});vis[m-1][i]=true;}}while(q.size()){auto [a,b]=q.front();q.pop();for(int i=0;i<4;i++){int x=a+dx[i];int y=b+dy[i];if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&vis[x][y]==false){q.push({x,y});vis[x][y]=true;}}}int step=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1&&vis[i][j]==false){step++;}}}return step;}
};

3.地图的最高点

题目链接
题目:

在这里插入图片描述

这道题其实是和第一道题是一样的
样例输出和输入:

在这里插入图片描述

这道题和第一题比较相似。
在这里插入图片描述
我们来看示例2,首先很明显,这道题需要我们返回一个二维矩阵,然后每个元素的特点就是距离最近的一个1的距离,很显然给出的示例中,1里1最近当然就返回的是0,第一个0距离最近的也是1,所以我们只需要照搬第一个题的算法即可,可以说和第一个题一模一样。

代码展示:

class Solution 
{
public:typedef pair<int,int> PII;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int m,n;vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {m=isWater.size();n=isWater[0].size();vector<vector<int>> answer(m,vector<int>(n,-1));queue<PII> q;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(isWater[i][j]==1){answer[i][j]=0;q.push({i,j});}}}while(q.size()){auto [a,b]=q.front();q.pop();for(int i=0;i<4;i++){int x=a+dx[i];int y=b+dy[i];if(x>=0&&x<m&&y>=0&&y<n&&answer[x][y]==-1){q.push({x,y});answer[x][y]=answer[a][b]+1;}}}return answer;}
};

4.地图分析

题目链接
题目:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题其实也是和第一道题一样的但是这道题要求变化后的二维数组中最大的那个数,并返回。

代码展示:

class Solution {
public:typedef pair<int,int> PII;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int m,n;int maxDistance(vector<vector<int>>& grid) {m=grid.size();n=grid[0].size();vector<vector<int>> dist(m,vector<int>(n,-1));queue<PII> q;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1){q.push({i,j});dist[i][j]=0;}}}int Max=-1;while(q.size()){auto [a,b]=q.front();q.pop();for(int i=0;i<4;i++){int x=a+dx[i];int y=b+dy[i];if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==0&&dist[x][y]==-1){q.push({x,y});dist[x][y]=dist[a][b]+1;Max=dist[x][y];    }}}return Max;}
};

总结

通过本文对BFS算法在解决多源最短路问题中的应用介绍,可以看出BFS在处理无权图的最短路径问题时具有显著优势。它不仅操作简单、直观易懂,而且其广度优先的特点使得它在寻找最短路径时非常高效。多源最短路问题在实际生活中有着广泛的应用,例如交通网络中的最短路径计算、社交网络中的影响力传播等。

在实现过程中,我们需要注意以下几点:

初始化多源节点:确保所有源节点都被正确加入队列,并且其初始距离设置为0。
处理并行搜索:合理安排队列的扩展,保证所有节点都能被正确访问。
避免重复访问:使用访问标记或距离数组来避免节点被重复处理,提高算法效率。
通过实际案例,我们可以看到BFS在解决多源最短路问题时的高效性和可靠性。希望通过这篇文章,读者能够更好地理解BFS算法的应用场景及其实现方法,为今后的算法学习和实际应用提供帮助。

如有任何疑问或建议,欢迎在评论区留言讨论。

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

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

相关文章

支付系统的渠道路由架构设计

图解支付系统的渠道路由设计 渠道路由是引导流量路径的关键&#xff0c;其设计至关重要。本文详解渠道路由概念、必要性及形态&#xff0c;并分享一个高效实用的基于规则的渠道路由设计方案。 注&#xff1a;有些公司称渠道为通道&#xff0c;都是一个意思&#xff0c;为方便起…

【React】ref

概述 使用 ref 引用值 – React 中文文档 希望组件“记住”某些信息&#xff0c;但又不想让这些信息更新时 触发新的渲染 时&#xff0c;可以使用 ref 。 也就是说 ref 对象 包裹的值 React 追踪不到的&#xff0c;他像是用来存储组件信息的秘密“口袋”。 与 state 相同的是…

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app&#xff1a;我们选择了uni-app作为开发框架&#xff0c;因为它基于Vue.js&#xff0c;允许我们编写一次代码&#xff0c;发布到多个平台&#xff0c;包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能&…

【PL理论深化】(3) MI 归纳法:归纳假设 (IH) | 结构归纳法 | 归纳假设的证明

&#x1f4ac; 写在前面&#xff1a;所有编程语言都是通过归纳法定义的。因此&#xff0c;虽然编程语言本身是有限的&#xff0c;但用该语言编写的程序数量是没有限制的&#xff0c;本章将学习编程语言研究中最基本的归纳法。本章我们继续讲解归纳法&#xff0c;介绍归纳假设和…

【论文阅读】场景生成及编辑3D定位论文阅读

<div id"content_views" class"htmledit_views" style"user-select: auto;"><div class"kdocs-document"> 前置知识 归纳偏置 关于归纳偏置的理解&#xff1a;首先推荐一篇解释归纳偏置非常好的博客&#xff1a;浅谈归纳…

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的&#xff0c;那么怎么更改系统的主频&#xff0c;这里做一个简单的介绍。首先要明白&#xff0c;单片机的程序是如何运行&#xff0c;这里简单说明一下。 对应的代码在startup_stm32....文件里面&#xff0c;这里是复位程序的汇编…

多分类情绪识别模型训练及基于ChatGLM4-9B的评论机器人拓展

你的下一个微博罗伯特何必是罗伯特 这是一篇我在使用开源数据集(Twitter Emotion Dataset (kaggle.com))进行情绪识别的分类模型训练及将模型文件介入对话模型进行应用的过程记录。当通过训练得到了可以输入新样本预测的模型文件后&#xff0c;想到了或许可以使用模型文件对新样…

JavaScript的学习之旅之初始JS

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…

【计算机网络仿真实验-实验3.1、3.2】交换路由综合实验

实验3.1 交换路由综合实验——作业1 一、实验目的 运用实验二&#xff08;可前往博主首页计算机网络专栏下查看&#xff09;中学到的知识&#xff0c;将这个图中的PC机连接起来组网并分析&#xff0c;本篇涉及代码以截图展示&#xff0c;过于简单的代码及操作不再详细介绍&…

RPC通信原理以及项目的技术选型

目录 1.引言 2、RPC通信原理 3.图示解析 4.再举个例子 1.引言 根据上一篇博客《单机&#xff0c;集群和分布式》的举的例子。 我们最终合理地通过对大型软件的合理划分&#xff0c;划分成不同模块&#xff0c;按需求&#xff08;硬件需求&#xff0c;高并发需求&#xff09…

K8S - 理解ClusterIP - 集群内部service之间的反向代理和loadbalancer

在Micro Service的治理中。 有两个很重要的点&#xff0c; 集群外部的用户/service 如何访问集群内的 入口服务(例如UI service&#xff09;集群内的service A 如何 访问 集群内的service B 为什么有上面的问题 无非是&#xff1a; 集群内的service 都是多实例的每个servic…

【区块链】区块链架构设计:从原理到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链架构设计&#xff1a;从原理到实践引言一、区块链基础概念1.1 区块链定义…

[系统运维|Xshell]宿主机无法连接上NAT网络下的虚拟机进行维护?主机ping不通NAT网络下的虚拟机,虚拟机ping的通主机!解决办法

遇到的问题&#xff1a;主机ping不通NAT网络下的虚拟机&#xff0c;虚拟机ping的通主机 服务器&#xff1a;Linux&#xff08;虚拟机&#xff09; 主机PC&#xff1a;Windows 虚拟机&#xff1a;vb&#xff0c;vm测试过没问题&#xff0c;vnc没测试不清楚 虚拟机网络&#xff1…

基础算法---滑动窗口

文章目录 什么是滑动窗口1.长度最小的子数组2.无重复字符的最长子串3.最大连续1的个数4.将x减到0的最小操作数5.最小覆盖子串总结 什么是滑动窗口 滑动窗口&#xff08;Sliding Window&#xff09;是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通…

【SQL每日一练】HackerRan-Basic Join-Challenges练习

文章目录 题目题析题解1.sqlserver 题目 编写一个查询来打印 hacker _ id、 name 和每个学生创建的挑战的总数。按照挑战的总数按降序对结果进行排序。如果不止一个学生创建了相同数量的挑战&#xff0c;那么按 hacker _ id 对结果进行排序。如果不止一个学生创建了相同数量的…

北京BJ90升级新款迈巴赫大连屏四座头等舱行政四座马鞍

北京BJ90升级奔驰迈巴赫头等舱行政四座大联屏的内饰效果会非常出色&#xff0c;将为车辆带来更豪华、高端的内饰氛围。以下是升级后可能的效果&#xff1a; • 科技感提升&#xff1a;奔驰的中控系统一直以来都以其先进的科技和用户友好的界面而闻名。升级后&#xff0c;北京B…

Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用

原文链接&#xff1a;http://cshelloworld.com/home/detail/1804473083243925504 当我们点击win10系统搜索框的时候&#xff0c;输入名称 &#xff0c;win10会帮助我们匹配到对应的应用。这里搜索框实际上就是windows系统的开始菜单。 接下来我们随便找一个应用&#xff0c;右…

湖北民族大学2024年成人高等继续教育招生简章

湖北民族大学&#xff0c;这所承载着深厚文化底蕴和卓越教育理念的学府&#xff0c;在崭新的2024年再次敞开怀抱&#xff0c;热烈欢迎有志于深化学习、提升自我的成人学员们。今年的成人高等继续教育招生&#xff0c;不仅是学校对于终身教育理念的具体实践&#xff0c;更是为广…

每日签到页面模板组件,简单好用,用了会上瘾的那种

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 今日给…

机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)

文章目录 前言一、普通实现1 数据集准备2 逻辑回归模型3 损失函数4 计算损失函数的梯度5 梯度下降算法6 训练模型二、多项式特征实现非线性分类1 数据准备与多项式特征构造2 逻辑回归模型三、逻辑回归 --- 正则化实现1 数据准备2 逻辑回归模型3 正则化损失函数4 计算损失函数的…