只有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;
}