题目分析




来源:acwing

只有边权为0和边权为1,两种情况。什么意思呢?两个点之间存在路径则边权为0,需要转一下连通的边权为1.

每个点可能入队多次,本质上是个dijkstra算法。

下图说明bfs枚举周围的4个点的坐标

我们还需要快速判断每个方向上的边是多少

ac代码

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int  N = 510, M = N *N;
int n, m;
char g[N][N];
int dist[N][N]; //有线路边权为0,需要旋转一下边权为1,然后求最短路
bool st[N][N]; //某点是否更新完最短路int bfs(){memset(st, 0, sizeof st);memset(dist, 0x3f, sizeof dist);deque<PII> q;q.push_back({0, 0});dist[0][0] = 0;char cs[5] = "\\/\\/";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()){auto t = q.front();q.pop_front();int x = t.x, y = t.y;// 出队列的时候,返回答案if( x == n && y == m) return dist[x][y];// 某点的最短路已算过,跳过if(st[x][y]) continue;st[x][y] = true;for(int i = 0; i < 4; i ++){// 扩展周围的点int a = x + dx[i], b = y + dy[i];//判断是否越界,这里合法点的坐标是x:[0,n],y:[0,m]都是闭区间if( a < 0 || a > n ||  b < 0 || b > m) continue;//方向在g数组中的坐标int ga = x + ix[i], gb = y + iy[i]; // 边权:如果g数组中方向和要求的一致,则边权为0,否则边权为1int w = g[ga][gb] != cs[i];// 计算距离int d  =  dist[x][y] + (w);// 更新距离if(d < dist[a][b]){dist[a][b] = d;if(! w) q.push_front({a,b});else q.push_back({a,b});}}}return -1;}int main(){int T;cin >> T;while( T--){cin >> n >> m;for(int i = 0; i < n; i ++) cin >> g[i];if( n + m &1) cout << "NO SOLUTION"<<endl;else cout << bfs() << endl;}
}

题目来源

https://www.acwing.com/problem/content/177/

算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难相关推荐

  1. 【双端队列广搜/搜索+图论】AcWing 2019.拖拉机 USACO 2012 March Contest Silver Division

    [题目描述] 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 NNN 捆干草,这样一来,约翰想要开走拖拉机就必须先移除 ...

  2. 2019 拖拉机(双端队列广搜)

    1. 问题描述: 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了.他的奶牛非常调皮,决定对约翰来场恶作剧.她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些 ...

  3. AcWing 342. 道路与航线 (双端队列广搜问题,SPFA)

    题目描述 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航线 (编号为1到P) 连接. 每条道路i ...

  4. 多源BFS-双端队列广搜

    多源BFS AcWing173. 矩阵距离 给定一个N行M列的01矩阵A,A[i][j]A[i][j]A[i][j] 与 A[k][l]A[k][l]A[k][l] 之间的曼哈顿距离定义为: dist ...

  5. 算法提高课-搜索-双向广搜 AcWing 190. 字串变换:bfs、双向bfs、queue和unordered_map

    题目分析 来源:acwing 分析: 双向广搜主要用在最小步数模型(也称状态图模型)里面,这里整个状态空间一般是指数级别的,用双向广搜可以极大地提高运行效率. 双向广搜,顾名思义,就是从起点和终点都进 ...

  6. 算法提高课-搜索-A*(A star)算法-AcWing 179. 八数码:A星算法求解

    题目分析 来源:acwing 分析: A*算法是什么呢? A算法是一种bfs的变式,需要用到一个"估价函数",用来计算任意状态到目标状态所需代价的估计值.然后在搜索中,维护一个堆, ...

  7. 算法提高课-搜索-Flood fill算法-AcWing 1097. 池塘计数:flood fill、bfs

    Flood fill 算法简介: 像洪水一样,一圈一圈往外蔓延,像bfs. flood fill 算法可以在线性复杂度内,找到某个点所在的连通块. 题目分析 来源:acwing ac代码 #inclu ...

  8. 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs

    题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...

  9. 算法提高课-搜索-DFS之连通性模型-AcWing 1112. 迷宫:dfs和bfs两种解法

    题目分析 来源:acwing 分析: dfs是一路搜下去,不撞南墙不回头. dfs解法 #include<bits/stdc++.h> using namespace std; const ...

最新文章

  1. SQLite.swift的简单使用
  2. 第32题 最长匹配括号
  3. 北理工团队在推动运动意图神经解码走向真实应用场景方面取得研究进展
  4. linux文件读写实例,[Linux文件]使用read函数从文件读取数据的实例
  5. 三种SQL分页查询的存储过程
  6. magento -- 修改文件来手动控制编译的开启和关闭
  7. pandas用众数填充缺失值_python数据分析包|Pandas-02之缺失值(NA)处理
  8. 可临摹学习的精致的音乐播放器界面设计ui模板
  9. html监控服务器状态,HTML5-WebSocket实现对服务器CPU实时监控
  10. 多个平台下使用Custom Fonts
  11. 读《暗时间》,学会思考
  12. 数据库中的超键 候选键 主键 外键
  13. SFP(Small Form-factor Pluggables)光模块
  14. 1024: 例题3-2 计算存款利息
  15. zt中俄两军炮兵的差距
  16. The Flask Mega-Tutorial 之 Chapter 8: Followers
  17. 南京理工大学计算机学院张勇,南京理工大学教师信息
  18. vite创建vue保姆级教程
  19. 12款浏览器兼容性测试工具推荐
  20. 新标准下企业申请测绘资质相关问题与解答

热门文章

  1. 面向对象数据库和关系数据库的区别
  2. 支持常见数据库差异对照说明
  3. 截取指定内容/截取用逗号隔开的各个关键字
  4. react ajax 分页,一款简单的react分页组件
  5. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
  6. everythingtoolbar.dll”或它的一个依赖项。_ASP.NET Core依赖注入最佳实践、提示和技巧...
  7. 【Paper】2015_异构无人机群鲁棒一致性协议设计_孙长银
  8. 【控制】《现代控制理论》谢克明老师-目录
  9. 1.8 欠拟合和过拟合-机器学习笔记-斯坦福吴恩达教授
  10. STM32 基础系列教程 38 - Lwip_http