蒟蒟蒟蒻的BFS入门
题目链接
用bfs遍历,询问m<=1e5,每次都BFS一次时间复杂度o(nm)肯定会爆,所以用数组存ans,每次搜索的时候把算出来出来的答案赋值给连通块中的所有ans(很好理解,比如a[1][1]可以到a[1][2],那么a[1][2]也可以到a[1][1],你可以到的地方我也能到,所以他们的答案是相同的)
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
int a[maxn][maxn];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool book[maxn][maxn];
int ans[maxn][maxn];
struct node{
int x,y;
node()
{}
node(int x,int y){
this->x=x;
this->y=y;
}
}vv[1100000];
int n,m;
void bfs(int x,int y){
int head=0,tail=0;
book[x][y]=true;
vv[tail]=node(x,y);
tail++;
while(head<tail){
node temp=vv[head];
for(int i=0;i<4;i++){
int tx=temp.x+dir[i][0];
int ty=temp.y+dir[i][1];
if(tx<1||tx>n||ty<1||ty>n)continue;
if(book[tx][ty])continue;
if(a[tx][ty]^a[temp.x][temp.y]){
vv[tail]=node(tx,ty);
tail++;
book[tx][ty]=true;
}
}
head++;
}
for(int i=0;i<tail;i++){
ans[vv[i].x][vv[i].y]=tail;
}
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>n>>m){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
char temp;
cin>>temp;
a[i][j]=temp-'0';
ans[i][j]=-1;
book[i][j]=false;
}
}
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
if(ans[x][y]==-1)bfs(x,y);
cout<<ans[x][y]<<endl;
}
}
return 0;
}