30pts求助!
查看原帖
30pts求助!
278605
梨衣楼主2020/11/2 16:14

WA#6#9,调不出来了

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
long long d[3][1100][1100],ans=0x7f7f7f7f7f7f7f7f,f[1100][1100];
bool v[1100][1100];
int n,m,a,b,c;
struct node{
	int x,y,dis;
	bool operator<(const node &z)const{
	return z.dis<dis;}
};
priority_queue<node>q;
void dij1(int xx,int yy){
	memset(v,0,sizeof(v));
	d[0][xx][yy]=f[xx][yy];
	q.push(node{xx,yy,d[0][xx][yy]});
	while(!q.empty()){
		node t=q.top();
		q.pop();
		int x1=t.x,y1=t.y;
		if(v[x1][y1])continue;
		v[x1][y1]=1;
		for(int i=0;i<4;i++){
			int x2=x1+dx[i],y2=y1+dy[i];
			if(x2<=0||y2<=0||x2>n||y2>m||v[x2][y2])continue;
			if(d[0][x2][y2]>d[0][x1][y1]+f[x2][y2]){
				d[0][x2][y2]=d[0][x1][y1]+f[x2][y2];
				q.push(node{x2,y2,d[0][x2][y2]});
			}
		}
	}
}
void dij2(int xx,int yy){
	memset(v,0,sizeof(v));
	d[1][xx][yy]=f[xx][yy];
	q.push(node{xx,yy,d[1][xx][yy]});
	while(!q.empty()){
		node t=q.top();
		q.pop();
		int x1=t.x,y1=t.y;
		if(v[x1][y1])continue;
		v[x1][y1]=1;
		for(int i=0;i<4;i++){
			int x2=x1+dx[i],y2=y1+dy[i];
			if(x2<=0||y2<=0||x2>n||y2>m||v[x2][y2])continue;
			if(d[1][x2][y2]>d[1][x1][y1]+f[x2][y2]){
				d[1][x2][y2]=d[1][x1][y1]+f[x2][y2];
				q.push(node{x2,y2,d[1][x2][y2]});
			}
		}
	}
}
void dij3(int xx,int yy){
	memset(v,0,sizeof(v));
	d[2][xx][yy]=f[xx][yy];
	q.push(node{xx,yy,d[2][xx][yy]});
	while(!q.empty()){
		node t=q.top();
		q.pop();
		int x1=t.x,y1=t.y;
		if(v[x1][y1])continue;
		v[x1][y1]=1;
		for(int i=0;i<4;i++){
			int x2=x1+dx[i],y2=y1+dy[i];
			if(x2<=0||y2<=0||x2>n||y2>m||v[x2][y2])continue;
			if(d[2][x2][y2]>d[2][x1][y1]+f[x2][y2]){
				d[2][x2][y2]=d[2][x1][y1]+f[x2][y2];
				q.push(node{x2,y2,d[2][x2][y2]});
			}
		}
	}
}
int main(){
	memset(d,0x7f,sizeof(d));
	scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%lld",&f[i][j]);
	dij1(1,a);
	dij2(n,b);
	dij3(n,c);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			ans=min(ans,d[0][i][j]+d[1][i][j]+d[2][i][j]-2*f[i][j]);
	printf("%lld",ans);	
}
2020/11/2 16:14
加载中...