60分咋就爆了呢,时间炸了,按理来说不会的啊!蒟蒻求助
查看原帖
60分咋就爆了呢,时间炸了,按理来说不会的啊!蒟蒻求助
543527
leo888楼主2021/8/13 21:55

思路: 输入完之后,我就重复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;
} 
2021/8/13 21:55
加载中...