iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++图搜索算法之双端队列广搜怎么实现
  • 234
分享到

C++图搜索算法之双端队列广搜怎么实现

2023-07-02 09:07:00 234人浏览 薄情痞子
摘要

这篇文章主要介绍“c++图搜索算法之双端队列广搜怎么实现”,在日常操作中,相信很多人在C++图搜索算法之双端队列广搜怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++图搜索算法之双端队列广搜怎么实现

这篇文章主要介绍“c++图搜索算法之双端队列广搜怎么实现”,在日常操作中,相信很多人在C++图搜索算法之双端队列广搜怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++图搜索算法之双端队列广搜怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

广度优先遍历

广度优先遍历是一种按照层次顺序进行访问的方法,它具有以下两种重要性质:

  • 在访问完所有第i层的结点后,才会去访问第i+1层的结点

  • 任意时刻,队列中至多有两个层次的结点。若其中一部分结点属于第i层,则另一部分结点属于第i+1层,并且所有第i层结点排在第i+1层之前。也就是说,广度优先遍历队列中的元素关于层次满足

双端队列BFS

在最基本的广度优先搜索中,每次沿着分支的扩展都记为“一步”,我们通过逐层搜索,解决了从起始状态到每个状态的最小步数的问题。这其实等价于在一张边权均为1的图上执行广度优先遍历,求出每个点相对于起点的最短距离(层次)。

由于广度优先遍历具有“两段性”和“单调性”,从而我们可以得知,每个状态在第一次被访问并且入队时,计算出的步数即为所求的最短步数。

当出现边权不是0就是1的时候,可以考虑采用双端队列BFS的方法来进行求解。

基本思路:

  • 如果拓展出来的点的边权是0的话,就添加到队头

  • 如果拓展出来的点的边权是1的话,就添加到队尾

正确性:

在通过上述的方式添加元素后,队列仍然能够满足“两段性”和“单调性”,所以所求的结果即为最短路(层次)。

例题:AcWing 175. 电路维修

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

翰翰的家里有一辆飞行车。

有一天飞行车的电路板突然出现了故障,导致无法启动。

电路板的整体结构是一个 RR 行 CC 列的网格(R,C≤500R,C≤500),如下图所示。

C++图搜索算法之双端队列广搜怎么实现

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

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

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

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

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

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

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

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

输入格式

输入文件包含多组测试数据。

第一行包含一个整数 TT,表示测试数据的数目。

对于每组测试数据,第一行包含正整数 RR 和 CC,表示电路板的行数和列数。

之后 RR 行,每行 CC 个字符,字符是"/"和"\"中的一个,表示标准件的方向。

输出格式

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

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

数据范围

1≤R,C≤5001≤R,C≤500,

1≤T≤51≤T≤5

输入样例

13 5\\/\\\\////\\\\

输出样例

1

样例解释

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

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

C++图搜索算法之双端队列广搜怎么实现

解题思路

C++图搜索算法之双端队列广搜怎么实现

如图所示,用红圈所圈起来的点都是从起点出发所不能到达的(沿对角线行走的情况下)

从起点出发所能达到的点的坐标之和应为偶数,图中所圈出来的点的坐标之和均为奇数。

所以我们第一步可以使用这个性质来判断终点是否能够到达。 

然后使用双端队列来进行解答,在这道题目中对于格子和点的对应关系需要进行思考。

将电路板上的每个格点(横线和竖线的交叉点)看做是无向图中的结点。如果对角线和x到y的线段重合,则边权为0;若不重合,则边权为1。

然后在图中求出从左上角到右下角的最短距离。

C++图搜索算法之双端队列广搜怎么实现

C++图搜索算法之双端队列广搜怎么实现

踩过格子到达想去的点时,需要判断是否需要旋转电线。

若旋转电线则表示从当前点到想去的点的边权是1,若不旋转电线则边权为0。

  • dx[]和dy[]表示可以去其他点的方向

  • ix[]和iy[]表示需要踩某个方向的点才能去到相应的点

  • cs[]表示当前点走到4个方向的点理想状况下格子形状(边权是0的状态)

AC代码

#include<iOStream>#include<deque>#include<cstring>#include<alGorithm> #define x first#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 510; int n,m;char g[N][N];int dist[N][N];;deque<PII> q; int bfs(){    memset(dist,0x3f,sizeof dist);    q.push_front({0,0});    dist[0][0]=0;    int dx[]={-1,-1,1,1},dy[]={-1,1,1,-1};    int ix[]={-1,-1,0,0},iy[]={-1,0,0,-1};     char s[]="\\/\\/";     while(q.size())    {        PII t=q.front();        q.pop_front();        for(int i=0;i<4;i++)        {            int a=t.x+dx[i],b=t.y+dy[i];            int aa=t.x+ix[i],bb=t.y+iy[i];            if(a<0||a>n||b<0||b>m) continue;            int d = dist[t.x][t.y]+(g[aa][bb]!=s[i]);            if (d < dist[a][b])            {                dist[a][b] = d;                 if (g[aa][bb] != s[i]) q.push_back({a, b});                else q.push_front({a, b});            }        }    }    return dist[n][m];}  int main(){   int T;    scanf("%d", &T);    while (T -- )    {        scanf("%d%d", &n, &m);        for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);        if((n+m)%2==1)         {            puts("NO SOLUTION");            continue;        }                        cout<<bfs()<<endl;    }    return 0;}

每个结点虽然可能被更新(入队)多次,但是它第一次被拓展(出队)时,就能得到从左上角到该点的最短距离,之后再取出可以直接忽略。

时间复杂度是O(M * N)

到此,关于“C++图搜索算法之双端队列广搜怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++图搜索算法之双端队列广搜怎么实现

本文链接: https://www.lsjlt.com/news/340886.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++图搜索算法之双端队列广搜怎么实现
    这篇文章主要介绍“C++图搜索算法之双端队列广搜怎么实现”,在日常操作中,相信很多人在C++图搜索算法之双端队列广搜怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++图搜索算法之双端队列广搜怎么实现...
    99+
    2023-07-02
  • 详解C++图搜索算法之双端队列广搜
    目录广度优先遍历双端队列BFS例题:AcWing 175. 电路维修解题思路AC代码广度优先遍历 广度优先遍历是一种按照层次顺序进行访问的方法,它具有以下两种重要性质: 在访问完所有...
    99+
    2024-04-02
  • Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法
    目录一.深度优先遍历和广度优先遍历1.深度优先遍历2.广度优先遍历二.图像渲染1.题目描述2.问题分析3代码实现1.广度优先遍历2.深度优先遍历三.岛屿的最大面积1.题目描述2.问题...
    99+
    2023-05-18
    Java深度优先和广度优先 Java深度优先 Java广度优先
  • Java中怎么利用阻塞队列实现搜索
    这期内容当中小编将会给大家带来有关Java中怎么利用阻塞队列实现搜索,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。队列以一种先进先出的方式管理数据。如果你试图向一个已经满了的阻塞队列中添加一个元素,或是从...
    99+
    2023-06-17
  • Python怎么实现图的广度和深度优先路径搜索算法
    本篇内容主要讲解“Python怎么实现图的广度和深度优先路径搜索算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现图的广度和深度优先路径搜索算法”吧!前言图是一种抽象数据结构...
    99+
    2023-06-30
  • JS数组搜索之折半搜索怎么实现
    这篇文章将为大家详细讲解有关JS数组搜索之折半搜索怎么实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:一. 方法原理:当从一个给定的序列数组arr中, 查找某...
    99+
    2024-04-02
  • Python实现图的广度和深度优先路径搜索算法
    目录前言1. 图理论1.1 图的概念1.2 定义图1.3 图的抽象数据结构2. 图的存储实现2.1 邻接矩阵2.2 编码实现邻接矩阵3. 搜索路径3.1 广度优先搜索3.2 深度优先...
    99+
    2024-04-02
  • Python双端队列怎么实现
    这篇文章主要介绍了Python双端队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python双端队列怎么实现文章都会有所收获,下面我们一起来看看吧。0. 学习目标双端队列是另一个线性数据结构。虽然它...
    99+
    2023-06-29
  • PHP中redis队列实现历史搜索功能的方法
    小编给大家分享一下PHP中redis队列实现历史搜索功能的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!redis队列实现历史搜索功能1、使用phpinfo()函数查看你的配置,匹配对应的...
    99+
    2024-04-02
  • 前端怎么实现搜索功能模块
    本篇内容介绍了“前端怎么实现搜索功能模块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用户使用产品,享受功...
    99+
    2024-04-02
  • c语言怎么实现单词搜索
    本文小编为大家详细介绍“c语言怎么实现单词搜索”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言怎么实现单词搜索”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单词搜索给定一个 m x n 二维字符网格 boa...
    99+
    2023-06-30
  • Python双端队列怎么实现回文检测
    本文小编为大家详细介绍“Python双端队列怎么实现回文检测”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python双端队列怎么实现回文检测”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、双端队列双端队列 ...
    99+
    2023-06-26
  • Java怎么利用广度优先搜索实现抓牛问题
    本篇内容介绍了“Java怎么利用广度优先搜索实现抓牛问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、原问题二、输入和输出输入两个数,第...
    99+
    2023-07-02
  • Python人工智能实战之以图搜图怎么实现
    本篇内容介绍了“Python人工智能实战之以图搜图怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实验要求给出一张图像后,在整个数...
    99+
    2023-06-30
  • 前端elementUI select选择器怎么实现远程搜索
    这篇文章主要介绍“前端elementUI select选择器怎么实现远程搜索”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端elementUI select选择器怎么实现远程搜...
    99+
    2023-06-30
  • C++怎么实现在旋转有序数组中搜索
    这篇文章主要介绍了C++怎么实现在旋转有序数组中搜索的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现在旋转有序数组中搜索文章都会有所收获,下面我们一起来看看吧。Search in Rotated S...
    99+
    2023-06-19
  • Vue的双端diff算法怎么实现
    这篇文章主要介绍了Vue的双端diff算法怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue的双端diff算法怎么实现文章都会有所收获,下面我们一起来看看吧。前言Vue 和 React 都是基于 vd...
    99+
    2023-07-02
  • C++ AVLTree高度平衡的二叉搜索树怎么实现
    这篇“C++ AVLTree高度平衡的二叉搜索树怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++&nb...
    99+
    2023-07-05
  • C#中怎么利用正则表达式实现预搜索
    这篇文章将为大家详细讲解有关C#中怎么利用正则表达式实现预搜索,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#正则表达式之正向预搜索声明格式:正声明 “(=&hellip;)”,负...
    99+
    2023-06-17
  • C语言数据结构与算法之队列的实现详解
    目录队列的概念及结构队列的实现Queue.hQueue.cTest.c队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FI...
    99+
    2022-11-13
    C语言数据结构 队列 C语言 队列实现 C语言 队列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作