求助
查看原帖
求助
324995
Aimtpyim楼主2023/7/15 10:46

只有10分QWQ,样例过不了

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
const int N=1005,inf=1e18;
struct node{
	ll x,y,dis;
	bool operator <(const node&b)const{return dis>b.dis;}
};
ll num[N][N],dis[5][N][N];
int n,m,a,b,c,px[5]{0,-1,1,0,0},py[5]={0,0,0,-1,1};
bool vis[N][N];
void dij(int nm,int sx,int sy)
{
	priority_queue<node> q;
	q.push((node){sx,sy,num[sx][sy]});
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			dis[nm][i][j]=inf;
	dis[nm][sx][sy]=num[sx][sy];
	while(!q.empty())
	{
		int x=q.top().x,y=q.top().y;
		q.pop();
		if(vis[x][y])continue;
		vis[x][y]=1;
		for(int i=1;i<=4;i++)
		{
			int tx=x+px[i],ty=y+py[i];
			if(tx<1||tx>n||ty<1||ty>m) continue;
			if(dis[nm][tx][ty]>dis[nm][x][y]+num[tx][ty])
			{
				dis[nm][tx][ty]=dis[nm][x][y]+num[tx][ty];
				q.push((node){tx,ty,dis[nm][tx][ty]});
			}
		}
	}
}
int main()
{
	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",&num[i][j]);
	dij(1,1,a);dij(2,n,b);dij(3,n,c);
	ll ans=inf;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			ans=min(ans,dis[1][i][j]+dis[2][i][j]+dis[3][i][j]);
	printf("%lld",ans);
	return 0;
}
2023/7/15 10:46
加载中...