#include<iostream>
#include<utility>
#include<cstdio>
#include<queue>
using namespace std;
long long n,m,a,b,c,anss=2147483647;
long long mp[1002][1002];
long long ans[1002][1002];
long long dis[1002][1002];
bool vis[1002][1002];
struct node
{
long long x,y,w;
bool operator<(const node &b)
{
return w>b.w;
}
};
priority_queue<node> q;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
node make_node(int _x,int _y,int _w)
{
node a;
a.x=_x;a.y=_y;a.w=_w;
return a;
}
void dij(int x,int y)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dis[i][j]=2147483647;
vis[i][j]=0;
}
}
q.push(make_node(x,y,0));
while(!q.empty())
{
node now=q.top();q.pop();
int nx=now.x,ny=now.y,nw=now.w;
if(vis[nx][ny]) continue;
vis[nx][ny]=1;dis[nx][ny]=nw;
for(int i=0;i<4;i++)
{
int tx=nx+dx[i];
int ty=ny+dy[i];
if(tx<1||ty<1||tx>n||ty>m) continue;
if(!vis[tx][ty]) q.push(make_node(tx,ty,nw+mp[tx][ty]));
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans[i][j]+=dis[i][j];
}
}
}
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<=n;j++)
{
scanf("%d",&mp[i][j]);
}
}
dij(1,a);
dij(n,b);
dij(n,c);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
anss=min(anss,ans[i][j]-2*mp[i][j]);
cout<<anss+mp[1][a]+mp[n][b]+mp[n][c];
return 0;
}
rt,报错报到头文件里了。。。看不懂