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);
}