AcWing 2019. 拖拉机(双端BFS)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 2019. 拖拉机(双端BFS)相关的知识,希望对你有一定的参考价值。

题目链接

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

思路

一个有0代价和1代价边权的最短路,我们用双端队列将0和1边权用一个双端队列分开存储,然后进行一个类迪杰斯特拉的最短路即可,值得注意的是,这个二维平面是无限大的,但是我们只需要多使用一层(这一圈都是空的)就好了,因为效果都一样,详情请看代码

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3+10;

bool mp[N][N];
int dis[N][N];
bool vis[N][N];
typedef pair<int,int>  PII;
int dx[4]=-1,0,1,0,dy[4]=0,-1,0,1;

bool check(int x,int y) 
	if(x >= 0 && x < N && y >= 0 && y < N) 
		return true;
	
	return false;




int bfs(int sx,int sy)
	deque<PII> que;
	que.push_back(sx,sy);
	memset(dis,0x3f,sizeof dis);
	dis[sx][sy] = 0;
	while(!que.empty())
		PII p = que.front();
		que.pop_front();
		int x = p.first;
		int y = p.second;
		if(vis[x][y]) continue;
		vis[x][y] = true;
		
		if(x == 0 && y == 0) break;
		for(int i = 0;i < 4; ++i) 
			int nx = x + dy[i];
			int ny = y + dx[i];
			if(check(nx,ny)) 
				int w = 0;
				if(mp[nx][ny]) w = 1;
				if(dis[nx][ny] > dis[x][y] + w) 
					dis[nx][ny] = dis[x][y] + w;
					if(!w) que.push_front(nx,ny);
					else que.push_back(nx,ny);
				
			
		
	
	return dis[0][0];



int main()
	int n,sx,sy;
	cin>>n>>sx>>sy;
	int x,y;
	for(int i = 1;i <= n; ++i) 
		cin>>x>>y;
		mp[x][y] = true;
	
	cout<<bfs(sx,sy)<<endl;
	return 0;

以上是关于AcWing 2019. 拖拉机(双端BFS)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 175. 电路维修 BFS+双端队列

BFS的队列

P1849 [USACO12MAR]拖拉机Tractor bfs

AcWing 1737. 传送

codeforces 1064D 双端队列BFS

浅谈双端队列广搜