思路: 输入完之后,我就重复a次感染源,然后把整个图的步数都算出来(应该不会超时的啊!),将最少步数存入d数组,最后再输出来,有dalao能优化一下下吗?
#include<bits/stdc++.h>
using namespace std;
const int fx[5]={0,1,0,-1,0};
const int fy[5]={0,0,1,0,-1};
int a[1000005],b[1000005],x[1000005],y[1000005];
int d[1005][1005];
int n,m,o,p,t;
bool vis[1005][1005];
struct node{
int px;
int py;
int step;
};
queue<node>q;
void bfs(int xx,int yy){
node sb={xx,yy,0};
q.push(sb);
while(!q.empty()){
node now=q.front();
q.pop();
for(int i=1;i<=4;i++){
int tx=now.px+fx[i];
int ty=now.py+fy[i];
if(vis[tx][ty]==0 && tx>=1 && ty>=1 && tx<=n && ty<=m){
vis[tx][ty]=1;
node kk={tx,ty,now.step+1};
if(t!=0)d[tx][ty]=min(d[tx][ty],now.step+1);
else d[tx][ty]=now.step+1;
q.push(kk);
}
}
}
}
int main(){
scanf("%d %d %d %d",&n,&m,&o,&p);
for(int i=1;i<=o;i++)scanf("%d %d",&x[i],&y[i]);
for(int i=1;i<=p;i++)scanf("%d %d",&a[i],&b[i]);
for(int i=1;i<=o;i++){
d[x[i]][y[i]]=0;
vis[x[i]][y[i]]=1;
bfs(x[i],y[i]);
t=1;
memset(vis,0,sizeof(vis));
}
for(int i=1;i<=p;i++){
cout<<d[a[i]][b[i]]<<endl;
}
return 0;
}