悬棺求条
查看原帖
悬棺求条
699876
Lacuna楼主2025/7/27 09:32

MLE,10分

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define gc getchar
#define pc putchar
#define pb push_back
#define ls u<<1
#define rs u<<1|1
#define mp(i,j) make_pair(i,j)
const int ri=1e3+5;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
template<typename T>inline void read(T&x){x=0;int f=1;char ch=gc();while(!isdigit(ch)){if(ch=='-') f=-1;ch=gc();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=gc();}x*=f;}
template<typename T,typename ...T1>inline void read(T&x,T1&...x1){read(x);read(x1...);}
struct node{
	int x,y,dis;
	bool operator<(const node &a)const{
		return a.dis<dis;
	}
};
int n,m,a,b,c,ans=1e18,res;
int e[ri][ri];
bool vis[ri][ri];
bool in(int x,int y){
	return 1<=x&&x<=n&&1<=y&&y<=m;
}
int bfs(int sx,int sy,int ex,int ey){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			vis[i][j]=0;
		}
	}
	int ans=1e18;
	queue<node> q;
	q.push({sx,sy,e[sx][sy]});
	while(q.size()){
		node t=q.front();
		q.pop();
		if(t.x==ex&&t.y==ey){
			ans=min(ans,t.dis);
			continue;
		}
		vis[t.x][t.y]=1;
		for(int i=0;i<=3;i++){
			int nx=t.x+dx[i],ny=t.y+dy[i];
			if(!vis[nx][ny]&&in(nx,ny)&&t.dis<ans){
				q.push({nx,ny,t.dis+e[nx][ny]});
			}
		}
	}
	return ans;
}
main(){
    read(n,m,a,b,c);
    for(int i=n;i>=1;i--){
    	for(int j=1;j<=m;j++){
    		read(e[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			res=bfs(n,a,i,j)+bfs(i,j,1,b)+bfs(i,j,1,c);
			ans=min(ans,res-2*e[i][j]);
		}
	}
	printf("%lld\n",ans);
	return 0;
}
2025/7/27 09:32
加载中...