【算法学习】01BFS
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!5.线段覆盖问题6.【算法学习】学换根dp有感7.二分图最大匹配
8.【算法学习】01BFS
9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树19.圆方树20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理29.【算法学习】欧拉函数φ30.【算法学习】二维转一维问题31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心前言
其实 01bfs 就是用队列维护的最短路,在权值只有 \(0\) 和 \(1\) 时就可以把权值为 \(0\) 的方案放到队列最前,权值为 \(1\) 的则放到最后,然后进行搜索,保证高效和正确性。
P4554 小明的游戏
模板题。
大部分 bfs 题都可以用最短路做,而最短路中 dijkstra 用堆优化保证权值小的优先操作,而这题权值只有 \(01\) 两种,所以用 01bfs,具体用 deque 操作,增加权值为 \(0\) 时(同色),放到队头,增加的权值为 \(1\) 时(异色),放到队尾,相当于直接 \(O(1)\) 排序好了。
#include <bits/stdc++.h> using namespace std; int n,m; int sx,sy,tx,ty; char c[505][505]; struct ss{ int x,y,w; }; deque<ss> q; bool vis[505][505]; int xx[5]={1,-1,0,0}; int yy[5]={0,0,1,-1}; int dfs01(){ while(!q.empty()){ q.pop_front(); } q.push_back({sx,sy,0}); while(!q.empty()){ ss u=q.front(); q.pop_front(); int x=u.x; int y=u.y; int w=u.w; vis[x][y]=1; if(x==tx&&y==ty){ return w; } for(int i=0;i<4;i++){ int xa=x+xx[i]; int ya=y+yy[i]; if(xa<0||xa>=n||ya<0||ya>=m){ continue; } if(vis[xa][ya]==0){ if(c[xa][ya]==c[x][y]){ q.push_front({xa,ya,w+0}); } else{ q.push_back({xa,ya,w+1}); } } } } return 0; } int main(){ ios::sync_with_stdio(false); while(1){ cin>>n>>m; if(n==0&&m==0){ break; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>c[i][j]; } } cin>>sx>>sy>>tx>>ty; cout<<dfs01()<<"\n"; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ vis[i][j]=0; } } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)