双端队列(双端bfs)解决边权只包含0和1的最短路问题

news2024/9/20 18:41:54

电路维修

达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。

翰翰的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障,导致无法启动。电路板的整体结构是一个 R行 C 列的网格(R,C≤500),如下图所示。

 

每个格点都是电线的接点,每个格子都包含一个电子元件。

电子元件的主要部分是一个可旋转的、连接一条对角线上的两个接点的短电缆。

在旋转之后,它就可以连接另一条对角线的两个接点。

电路板左上角的接点接入直流电源,右下角的接点接入飞行车的发动装置。

达达发现因为某些元件的方向不小心发生了改变,电路板可能处于断路的状态。

她准备通过计算,旋转最少数量的元件,使电源与发动装置通过若干条短缆相连。

不过,电路的规模实在是太大了,达达并不擅长编程,希望你能够帮她解决这个问题。

注意:只能走斜向的线段,水平和竖直线段不能走。

输入格式

输入文件包含多组测试数据。第一行包含一个整数 T,表示测试数据的数目。对于每组测试数据,第一行包含正整数 R和 C,表示电路板的行数和列数。之后 R行,每行 C个字符,字符是"/""\"中的一个,表示标准件的方向。

输出格式

对于每组测试数据,在单独的一行输出一个正整数,表示所需的最小旋转次数。

如果无论怎样都不能使得电源和发动机之间连通,输出 NO SOLUTION

数据范围

1≤R,C≤500,1≤T≤5

输入样例:

1
3 5
\\/\\
\\///
/\\\\

输出样例:

1

样例解释

样例的输入对应于题目描述中的情况。

只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。

 思路:

这道题遇到的每个器件有两种状态,一个需要旋转,一个不需要旋转,由于我们要求旋转的次数要尽量的少,所以不旋转我们可以看成是0,旋转可以看成权重是1,这和普通的宽搜就有了区别:

普通的宽搜边权都是1,而这个有边权是0的情况,那么宽搜的特点是什么呢?

宽搜的两个性质:

1、两阶段性

即开始的一段都是x,后一段都是x+1。

2.单调性

由两阶段性可知,长的总是在右边,即队列从开始到结束,先遇到的最短。

那么此题中边权有0怎么办

其实边权为0就可以看成x+0

那是不是就理应放在左边

于是,我们可以用一个双端队列,权重是0,加在左边,权重是1加在右边。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 510;
int n, m;
char g[N][N];
int dist[N][N];
bool st[N][N];

int bfs() {
    memset(dist, 0x3f, sizeof dist);
    memset(st, 0, sizeof st);
    dist[0][0] = 0;
    deque<PII> q;
    q.push_back({ 0,0 });

    char cs[] = "\\/\\/";
    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 };

    while (q.size()) {
        PII t = q.front();
        q.pop_front();

        if (st[t.first][t.second])continue;
        st[t.first][t.second];

        for (int i = 0; i < 4; i++) {
            int a = t.first + dx[i], b = t.second + dy[i];
            if (a<0 || a>n || b<0 || b>m)continue;

            int ca = t.first + ix[i], cb = t.second + iy[i];
            int d = dist[t.first][t.second] + (g[ca][cb] != cs[i]);

            if (d < dist[a][b]) {
                dist[a][b] = d;
                if (g[ca][cb] != cs[i])q.push_back({ a,b });
                else q.push_front({ a,b });
            }
        }
    }
    return dist[n][m];
}

int main()
{
    int T;
    cin >> T;
    while (T--) {
        cin >> n >> m;

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

        int t = bfs();

        if (t == 0x3f3f3f3f)cout << "NO SOLUTION" << endl;
        else cout << t << endl;
    }
    return 0;
}

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

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

相关文章

关于 re.sub 部分替换的解决办法

关于 re.sub 部分替换的解决办法写作背景问题重现解决办法代码详解结尾写作背景 最近本菜鸡遇到一个问题&#xff0c;我想将字符串中某一部分替换成指定内容&#xff0c;而且为了定位到要替换的内容&#xff0c;所以使用正则的时候还需要前后一些字符作为锚点&#xff0c;这可…

linux下基本命令

linux下基本命令一、linux相关快捷键二、linux下内部命令和外部命令2.1 内建命令2.2 外部命令2.3 内建命令和外部命令对比2.4 命令类型查看方法2.4 内建命令和外部命令帮助三、man手册四、相对路径和绝对路径五、pwd和cd命令六、mkdir创建目录七、rmdir删除目录八、linux文件类…

JMeter如何自定义HTTP组件

JMeter是一个优秀的开源项目&#xff0c;我们可以在jmeter的官网了解到如何使用和如何二次开发&#xff1a;Apache JMeter - Apache JMeter™ 因工作需要&#xff0c;最近做了一个JMeter自定义的http组件&#xff08;其实就是在http的基础上加了点东西而已&#xff09;。现就该…

TCO-PEG5-amine,NH2-PEG5-TCO,反式环辛烯-五聚乙二醇-氨基广泛应用于生物学研究

TCO-PEG5-NH2中英文名&#xff1a; CAS号&#xff1a;N/A | 英文名&#xff1a;TCO-PEG5-amine&#xff0c;TCO-PEG5-NH2 |中文名&#xff1a;反式环辛烯-五聚乙二醇-氨基TCO-PEG5-NH2物理参数&#xff1a; CASNumber&#xff1a;N/A Molecular formula&#xff1a;C21H40N2O7…

没有实施APS软件的工厂,常常面临的问题

对于制造工厂车间的运行而言&#xff0c;计划是核心的业务。制造工厂面对这么多订单并行生产执行、受制于有限的制造资源&#xff0c;如何安排次序、如何权衡轻重缓解&#xff0c;其实都是计划的范畴&#xff0c;计划执行过程总是受到各种形式的干扰或冲击&#xff0c;如何综合…

虹科分享 | 网络性能监控 | 网络中的应用性能意味着什么?

TCP协议的可靠性 数据包丢失是对网络的破坏&#xff0c;因为它导致延迟。TCP协议建立了可靠的数据传输&#xff0c;但掩盖了丢包的影响。TCP确保数据的传输是基于一个叫做 "滑动窗口 "的概念。这种机制控制着传输的字节序列和收到的确认。 在排序的帮助下&#xff…

项目管理之信息文档管理与配置管理(第一篇)

目录 前言 一、软件文档的分类 1.开发文档 2.产品文档 3.管理文档 二、文档质量的四个等级 1.1级文档 2.内部文档&#xff08;2级&#xff09; 3.工作文档&#xff08;3级文档&#xff09; 4.正式文档&#xff08;4级文档&#xff09; 三、配置管理 1.配置管理的定义…

XCTF-web1文件包含绕过file include

场景一&#xff1a; fileclude 题目描述 好多file呀&#xff01; 进入场景 给出PHP源码 包含flag.php文件 GET获取两个参数file1和file2 当参数不为空时&#xff0c;使用file_get_contents()函数将文件内容读入字符串&#xff0c;判断是否为"hello ctf" 利用ph…

vue项目前端优化处理方案整理

vue项目前端优化处理 目录 vue项目前端优化处理 路由懒加载 按需引入模块 外部资源引入&#xff0c;cdn加载 移除项目中所有的console.log()控制台信息数据打印 是否在构建生产包时生成sourcdeMap 上传图片文件压缩 开启gizp压缩 前端页面代码优化 路由懒加载 路由懒…

【深度学习】特征图的上采样(nn.Upsample)和转置卷积(nn.ConvTranspose2d) | pytorch

文章目录前言一、nn.Upsample 上采样二、nn.ConvTranspose2d 转置卷积前言 这次就不废话了&#xff0c;我想赶在10点前回去洗头&#xff08;现在9.17&#xff0c;还差一篇文章&#xff09; 一、nn.Upsample 上采样 该函数有四个参数&#xff1a; 参数的介绍如下&#xff1a…

工厂模式(Factory Pattern) 与抽象工厂模式(Abstract Factory Pattern)

工厂模式&#xff08;Factory Pattern) 与抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 工厂模式属于构造型模式&#xff0c;是项目中最常用到的一种设计模式。它的主要作用是提供一种简单的创建对象的方式&#xff0c;使用者无需知道创建实例的细节以及需要…

重启虚拟机启动Docker常见问题

文章目录重启虚拟机启动Docker常见问题一、Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?二、admin is not in the sudoers file. This incident will be reported.&#xff08;没有这个问题请自觉跳过&#xff09;三、…

华清远见11.17

1.在用户空间中有个字符数组&#xff0c;要求在内核空间打印&#xff0c;用dmesg查看。&#xff08;ioctl实现&#xff09; zy.h&#xff0c;封装一个发送用的命令码 #ifndef __LED_H__ #define __LED_H__ #define UACCESS_BUF _IOW(a,1,char [128]) #endif zy.c 申请并自动创…

2022 开源之夏|EMQ 三大开源项目开发圆满收官

今年暑假&#xff0c;EMQ 携手开源之夏&#xff0c;与高校学生开展了一场精彩纷呈的开源之旅。开源之夏&#xff08;OSPP&#xff09;是由中科院软件所「开源软件供应链点亮计划」发起的、面向高校学生的暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&a…

CE-Net: Context Encoder Network for 2D MedicalImage Segmentation

Title:用于二维医学图像分割的上下文编码器网络 摘要&#xff1a;在医学图像分割领域中&#xff0c;基于UNet已经成为主流的应用框架。但是在UNet结构中连续的池化和跨步卷积操作会导致一些空间信息的丢失。在本文中提出了一个上下文编码器网络&#xff08;简称为CE-Net&#…

数据分析师的Windows装机必备软件

文章目录1. Python安装包列表2. Office 3653. Visual Studio Code4. Git5. 向日葵6. 聊天软件7. OneDrive8. iCloud9. 网易邮箱大师10. 搜狗输入法11. 阿里云盘对于数据分析师,装机是再经常不过的一件事情,但是每次装机都要想装什么好,找来找去,故列出来供大家参考. 当然, 系统…

CentOS7自有服务和软件包

文章目录什么是服务管理服务的命令&#xff1a;systemctl列出服务服务启停开机自动启动服务服务状态软件包RPM查询安装了什么软件卸载某个软件安装某个软件查询文件所属的包名查询软件安装后&#xff0c;生成了哪些文件YUM命令epel-release什么是服务 什么是程序&#xff08;C…

最优化——凸优化概述

引言 这是中科大最优化理论的笔记&#xff0c;中科大凌青老师的凸优化课程&#xff0c;详尽易懂&#xff0c;基础扎实。不论是初学者还是从业多年的人&#xff0c;都值得系统地好好学一遍。 本文主要介绍什么是凸优化&#xff0c;通过几个例子来阐述什么是凸优化问题。让大家…

3年测试经验,面试27k自动化测试岗被diss,想给进阶自动化的人提个醒...

毕业后一直从事功能测试的工作&#xff0c;时间久了就没有一点想法&#xff0c;天天都是点点点&#xff0c;也没有一点提升&#xff0c;看着身边一个个的人都忙得不可开交&#xff0c;打听之后知道他们都是在技术上忙&#xff0c;而不像我&#xff0c;在杂事上忙&#xff0c;特…

vue 使用screenfull 实现全屏展示,全局水印实现, 以及全屏放大后部分组件无法使用,水印无法全屏显示问题的解决

需求&#xff1a;1. web项目中看板页面需要单独全屏显示 2. 项目全局增加水印&#xff0c;水印文字为当前用户登录姓名&#xff0c;登录页不显示水印 出现问题描述 单页面进行全屏显示&#xff0c;下拉&#xff0c;时间选择器&#xff0c;抽屉等组件被 全屏覆盖到下一层&…