详解C++图搜索算法之双端队列广搜_第1页
详解C++图搜索算法之双端队列广搜_第2页
详解C++图搜索算法之双端队列广搜_第3页
详解C++图搜索算法之双端队列广搜_第4页
详解C++图搜索算法之双端队列广搜_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第详解C++图搜索算法之双端队列广搜目录广度优先遍历双端队列BFS例题:AcWing175.电路维修解题思路AC代码

广度优先遍历

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

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

双端队列BFS

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

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

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

基本思路:

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

正确性:

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

例题:AcWing175.电路维修

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

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

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

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

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

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

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

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

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

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

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

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

输入格式

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

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

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

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

输出格式

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

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

数据范围

1R,C5001R,C500,

1T51T5

输入样例

1

\\/\\

\\///

/\\\\

输出样例

1

样例解释

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

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

解题思路

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

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

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

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

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

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

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

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

dx[]和dy[]表示可以去其他点的方向ix[]和iy[]表示需要踩某个方向的点才能去到相应的点cs[]表示当前点走到4个方向的点理想状况下格子形状(边权是0的状态)

AC代码

#includeiostream

#includedeque

#includecstring

#includealgorithm

#definexfirst

#defineysecond

usingnamespacestd;

typedefpairint,intPII;

constintN=510;

intn,m;

charg[N][N];

intdist[N][N];;

dequePII

intbfs()

memset(dist,0x3f,sizeofdist);

q.push_front({0,0});

dist[0][0]=0;

intdx[]={-1,-1,1,1},dy[]={-1,1,1,-1};

intix[]={-1,-1,0,0},iy[]={-1,0,0,-1};

chars[]="\\/\\/";

while(q.size())

PIIt=q.front();

q.pop_front();

for(inti=0;ii++)

inta=t.x+dx[i],b=t.y+dy[i];

intaa=t.x+ix[i],bb=t.y+iy[i];

if(a0||an||b0||bm)continue;

intd=dist[t.x][t.y]+(g[aa][bb]!=s[i]);

if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论