第五十一章 BFS进阶(一)——双端队列广搜

news2024/12/30 1:28:58

第五十一章 BFS进阶(一)——双端队列广搜

  • 一、原理
  • 二、例题
    • 1、问题
    • 2、分析
  • 三、代码

一、原理

在介绍双端队列广搜之前,我们先回顾一下堆优化版本的 d i j k s t r a dijkstra dijkstra算法。

在这个算法中,我们使用的是小根堆来找到距离起点的最小值。而这个最小值就是该点到起点的最短距离。然后我们再用这个最小值去松弛该点的临边。

如果临边松弛成功,就让这个点进入我们的优先队列。

今天所涉及到的双端队列广搜相当于一个特殊情况下的dijkstra算法。

我们先来剖析一下之前的朴素版本的BFS。

我们的朴素版本的BFS也用到了一个队列,只不过我们用的是普通队列。

那么这个队列有什么特殊的性质呢?

在这里插入图片描述
我们假设现在BFS到了红色线所在的层,那么假设第一个红色点出队,然后该红色点又更新了两个蓝色点,那么这两个点也会进队列。

那么我们就发现队列中的点是符合二段性的。

即前一段到原点的距离是x,后一段到原点的距离是x+1,不可能出现第三段。

因为如果出现了第三段,一定是从第二段的x+1扩展出来的。而轮到第二段出队的时候,第一段肯定早就出队了,此时队列中是第二段和第三段,依旧符合二段性。

那么这个二段性还有一个特殊的地方,它是距离小的一段在前面,距离大的一段在后面,这就符合了单调递增的性质。

因此,我们的队头就是最小的,也就是说在这种特殊的情况下, 我们的队列达到了和优先队列一样的效果。

那么知道了这个有什么用呢?

我们可以换一个角度,我们把第一段的x看作x+0。

此时,我们我们的图就不在是只存在边权为1的图,而是存在边权为1和0的图。

有了这个思路以后,我们再来模拟一下dijkstra的过程。

当队头出队的时候,此时是距离原点最近的点。假设这个最小距离是x,该点是A。

再给A设置几个邻接点:B,C,D。

这三个点到A的距离是0,1,0。

不妨让A点成功松弛这几个点,那么这几个点都会入队。

其中B到原点的距离就是x+0,C到原点的距离就是x+1,D到原点的距离就是x + 0

那么为了维护我们队列的二段性,我们就会把B和D点放到队列中的前半段,C放到队列中的后半段。

即从两边插入队列。

好,现在我们就发现,当一个图中存在只存在两个非负边权的时候,我们就能够通过维护一个队列的二段性,来实现一个简易地dijkstra算法。

于是我们就把这种方式叫做双端队列广搜

二、例题

1、问题

在这里插入图片描述

2、分析

这个我们就可以把翻转电线的次数看作边权,如果不翻转的话,就是0,如果翻转的话就是1。

现在让求的是最小的翻转次数,即从(0,0)右下角的最短路径。

由于只存在两个非负边权,因此我们可以使用双端队列广搜算法

这道题在知道该算法后,还有一个难点就是如何建图。

在这里插入图片描述

我们的BFS是在红色图中进行的,因此我们先看看红色图中的某个点可以向哪几个方向BFS。

在这里插入图片描述

除了记录它能向哪个方向拓展外,我们还需要记录一下,它是沿着怎样放置的一根电线到达的。

在这里插入图片描述
给图中的四个点标号。

图中的橙色线就是我们通过中心点,到达标号点所需要经过的电线。

我们如果按照标号存下来的话,字符串就是“\ / \ /”

但是“\”是特殊字符,我们需要再输入一个反斜杠即,“\\ / \\ /”

那么这个橙色线是理论上,电线的放置形状。

我们还需要通过中心点,找到该点实际上的电线放置情况。

如果二者相同,则说明不用翻转,边权是0,反之是1。

现在要解决的问题,就是如何通过中心点找到对应位置的实际电线放置情况。

我们刚才的橙色坐标图上,是将电线的坐标写在了电线的重心处。

现在我们将电线的坐标移动到电线所在格子的左上角。

在这里插入图片描述

这样这个图就和我们的红色坐标图统一了。

接着我们就可以计算一下,如何通过中心点,通过偏移,找到真实电线的位置。
在这里插入图片描述

知道了这些后,我们就可以写代码了。

三、代码

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int > pii;
const int N = 510, M = N * N;
const int INF = 0x3f3f3f3f;
int n, m;
char g[N][N];
bool st[N][N];
int dis[N][N];

int bfs()
{
	memset(dis, 0x3f, sizeof dis);
	memset(st, 0, sizeof st);
	deque<pii>q;
	
	int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};
	int ix[4] = {-1, -1, 0, 0}, iy[4] = {-1, 0, 0, -1};

	char cs[] = "\\/\\/";

	q.push_front({0, 0});
	dis[0][0] = 0;
	
	while(q.size())
	{
		pii t = q.front();
		q.pop_front();
		if(st[t.x][t.y])continue;
		st[t.x][t.y] = true;
		for(int i = 0; i < 4; i ++ )
		{
			int nx = t.x + dx[i];
			int ny = t.y + dy[i];
			if(nx >= 0 && nx <= n && ny >= 0 && ny <= m)
			{
				int d = dis[t.x][t.y] + (g[t.x + ix[i]][t.y + iy[i]] != cs[i]);
				if(d < dis[nx][ny])
				{
					dis[nx][ny] = d;
					if(g[t.x + ix[i]][t.y + iy[i]] != cs[i])
					{
						q.push_back({nx, ny});
					}
					else
					{
						q.push_front({nx, ny});
					}
				}
			}
		}
	}
	return dis[n][m];
}

void solve()
{
	cin >> n >> m;

	for(int i = 0; i < n; i ++ )
		cin >> g[i];

	int t = bfs();

	if(t == INF)
		cout << "NO SOLUTION\n";
	else cout << t << "\n";

}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t -- )
	{
		solve();
	}
	return 0;
}

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

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

相关文章

java基础—Volatile关键字详解

java基础—Volatile关键字详解 文章目录java基础—Volatile关键字详解并发编程的三大特性&#xff1a;volatile的作用是什么volatile如何保证有可见性volatile保证可见性在JMM层面原理volatile保证可见性在CPU层面原理可见性问题的例子volatile如何保证有序性单例模式使用volat…

概率统计·假设检验【正态总体均值的假设检验、正态总体方差的假设检验】

均值假设检验定义 2类错误 第1类错误&#xff08;弃真&#xff09;&#xff1a;当原假设H0为真&#xff0c;观察值却落入拒绝域&#xff0c;因而拒 绝H0这类错误是“以真为假” 犯第一类错误的概率显著性水平α第2类错误&#xff08;取伪&#xff09;&#xff1a;当原假设H0不…

基于参数化模型的3D产品配置器开发

当我被要求为客户创建3D产品配置器时&#xff0c;我想到的第一个平台是 SketchFab。 我是在澳大利亚墨尔本的 SAE 创意媒体学院学习计算机动画时接触到它的。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 1、基于Sketchfab开发3D产品配置器 SketchFab 是在线共享…

码住!为什么一定要做tiktok小店?赶快来开启爆单模式!

随着短视频和社交电商的结合&#xff0c;商家的变现渠道变得更加宽广。各大平台也开启了直播带货的赛道&#xff0c;在跨境行业中&#xff0c;tiktok小店也是商家们关注的渠道。很多商家也开始做tiktok小店&#xff0c;那我们可以先了解一下这小店的优势。tiktok小店拥有优质的…

并发线程、锁、ThreadLocal

并发编程并发编程Java内存模型&#xff08;JMM&#xff09;并发编程核心问题—可见性、原子性、有序性volatile关键字原子性原子类CAS(Compare-And-Swap 比较并交换)ABA问题Java中的锁乐观锁和悲观锁可重入锁读写锁分段锁自旋锁共享锁/独占锁公平锁/非公平锁偏向锁/轻量级锁/重…

02- pandas 数据库 (机器学习)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

J6412四网口迷你主机折腾虚拟机教程

今天给大家做一个四网口迷你主机折腾虚拟机的安装教程&#xff0c;主机采用的是maxtang大唐NUC J6412 intel i226V四网口的迷你主机&#xff0c;这款主机它是不能直接装上NAS的&#xff0c;必须使用虚拟机系统&#xff0c;近期研究了下然后做了一个教程分享给大家。 首先需要做…

Antd-table全选踩坑记录

目录 一、需求 二、问题 ​编辑三、解决 四、全选选中所有数据而不是当前页 一、需求 最近遇到一个小小的需求&#xff0c;在我们这个项目中&#xff0c;有一个表格需要添加全选删除功能。这还不简单吗&#xff0c;于是我找到andt的官网&#xff0c;咔咔咔一顿cv&#xff0…

「自控元件及线路」14 电子电力技术与功率放大器概述

本节介绍电子电力技术的基本概念 本节介绍PD、SCR、GTR、MOSFET、IGBT等电子电力器件 本节介绍功率放大器的基本概念和线性功率放大器 文章目录电力电子技术概述电能变换电子电力器件功率二极管PD晶闸管SCR功率晶体管GTR功率场效应晶体管PowerMOSFET绝缘栅双极晶体管IGBT功率放…

代码随想录.力扣.二叉树.105/106. 从中序与前序/后序序列构造二叉树

题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,2…

Notion 笔记Mac及windows客户端汉化

1、 注册/登录账号&#xff1a; https://www.notion.so/zh-cn 2、下载电脑软件应用&#xff1a; https://www.notion.so/desktop 下载完成后&#xff0c;安装到电脑中&#xff0c;界面如下&#xff1a; 3、下载汉化js插件 地址&#xff1a;https://github.com/Reamd7/n…

String、StringBuffer、StringBuilder有什么区别?

第5讲 | String、StringBuffer、StringBuilder有什么区别&#xff1f; 今天我会聊聊日常使用的字符串&#xff0c;别看它似乎很简单&#xff0c;但其实字符串几乎在所有编程语言里都是个特殊的存在&#xff0c;因为不管是数量还是体积&#xff0c;字符串都是大多数应用中的重要…

【PR】源窗口

【PR】源窗口源窗口粗剪源窗口按钮功能标记按钮出入点相关插入与覆盖插入覆盖导出帧使用软件&#xff1a;Premiere2020 源窗口粗剪 我们手上可能有一些很长的视频&#xff0c;但是我就想要其中的几段&#xff0c;这个时候粗剪就很方便&#xff0c;把想要的视频段落剪出来先凑一…

私募证券基金动态-23年1月报

成交量&#xff1a;1月日均7,901.31亿元2023年1月A股两市日均成交7,901.31亿元&#xff0c;环比上升0.33%、同比下降25.18%。1月恰逢春节仅16个交易日&#xff0c;节后2个交易日交易量明显回暖。管理人&#xff1a;新提交备案51家&#xff0c;备案通过21家1月新提交备案申请的5…

分析了 200 个 DeFi 项目,我发现了这些规律

作者&#xff1a;Ren & Heinrich翻译&#xff1a;dongdong在这篇文章中&#xff0c;我分享了我通过分析当前排名前 200 的 DeFi 加密项目的见解。这不是一项学术研究。尽管如此&#xff0c;这些发现对加密货币投资者来说具有附加值。我使用 https://defillama.com/ 的公共数…

财报解读:业务复苏迹象明显,中国中免能否重写增长神话?

2月3日&#xff0c;中国中免披露2022年度业绩快报&#xff0c;2022年总营收为544.63亿元&#xff0c;同比下降19.52%&#xff1b;实现归属于上市公司股东的净利润50.25亿元&#xff0c;同比下降47.95%。来源&#xff1a;中国中免2022年度业绩快报业绩近乎腰斩&#xff0c;但从长…

库存管理系统软件哪个好用 盘点前十名!

库存管理怎么做&#xff1f;库存管理系统有什么用处&#xff1f;市面上那么多库存管理系统&#xff0c;我们又如何挑选呢&#xff1f; 本文将为您介绍库存管理系统挑选的方法以及库存管理系统的选型。 库存管理系统前十名为&#xff1a;1、简道云库存管理软件&#xff1b;2、…

网络通讯的理解

tcp/ip 协议族ip在真实环境中&#xff0c;会把主机号再分成一个子网号和一个主机号。这样的主机号才是最终容纳的主机数量。所以需要使用子网掩码&#xff08;32位&#xff09;来分子网号和主机号。其中值为1的比特是网络号和子网号&#xff0c;值为0的是比特是主机号。可以在w…

真的麻了,别再为难软件测试员了......

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

Nacos【一】Nacos集群部署配置

系列文章目录 暂无 文章目录系列文章目录前言一、Nacos集群架构1.ip直连2. SLB3. 域名-SLB二、集群部署准备2.1 机器准备2.2 Nginx安装配置1.安装2.负载均衡配置2.3 nacos安装配置1.nacos节点2. MySQL准备1.Docker安装MySQL2. nacos对应数据库初始化三、 集群启动1.失败原因汇…