首页 > 其他分享 >01BFS

01BFS

时间:2024-09-17 13:12:36浏览次数:7  
标签:int xa ya 权值 front 01BFS 505

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;
}

标签:int,xa,ya,权值,front,01BFS,505
From: https://www.cnblogs.com/sadlin/p/18417094

相关文章

  • 01bfs
    针对一类特殊图求最短路,如果边权只有01则可以使用双端队列代替堆,将最短路的时间复杂度从\(O(nlogn)\)降为\(O(n)\)。原理:每次所走边边权为0则放队首,边权为1则放队尾。题目1#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definepiipair<int,int>#......
  • 01bfs
    今天写一个最短路题边权为\(0\)或\(1\),我说这不一眼\(dij\)么?结果题解区全部写的\(O(n+m)\)的\(01bfs\)。好家伙我居然一直不知道这么个东西,花了一个小时看会了,写一下原理。实现的方法很简单,就是一个双端队列,去\(nm\)的\(deque\),我有手,可以手写。在这里讲一下正确......
  • 「WOJ 4701」Walk 虚点建图+01bfs
    前言模拟赛中,yzh遇到了这道题,但由于yzh没有学过01bfs。。。所以就一直在优化这道题,导致浪费了很长时间(但nfls的数据太水,dij和spfa都能过)Description给你一个\(n\)个......
  • 必须经过关键点或达成某些状态的单源最短路-01bfs
    https://ac.nowcoder.com/acm/contest/45670/D题目描述:小竹成功从家里逃了出来,他决定去小胖家避一避。但是小胖要求小竹带一个刺激度大于xx的游戏才能去他家。为了防......
  • 01bfs 小专题
    概括:边权为0/1的图求最短路,常见于网格图的bfs。本质是特殊的dijkstra,因为边权只有0/1,不再需要优先队列维护Luogu4667注意需要维护的是格点的坐标和格子的坐标,然后边权如......