思路堆优dij,WA#5#6#9
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
#define ll long long
const ll INF = 2000000009;
struct node{
int x;
int y;
ll sum;
bool operator <(const node &p)const{
return p.sum < sum;
}
};
priority_queue<node>q;
int vis[1005][1005][4],n,m,a,b,c;
ll sum[1005][1005][4],w[1005][1005];
ll ans = 2000000009;
ll min(ll x,ll y){return x > y?y:x;}
int s[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void dij(int x,int y,int z){
q.push({x,y,sum[x][y][z]});
while(!q.empty()){
node p = q.top();
q.pop();
if(vis[p.x][p.y][z])continue;
vis[p.x][p.y][z] = 1;
for(int i = 0;i <= 3;++i){
int tx = p.x + s[i][0];
int ty = p.y + s[i][1];
if(tx <= 0 || ty <= 0 || tx > n ||ty > m)continue;
if(sum[p.x][p.y][z] + w[tx][ty] < sum[tx][ty][z]){
sum[tx][ty][z] = sum[p.x][p.y][z] + w[tx][ty];
q.push({tx,ty,sum[tx][ty][z]});
}
}
}
return;
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
for(int i = n;i >= 1;--i)
for(int j = 1;j <= m;++j)
scanf("%lld",&w[i][j]);
for(int i = n;i >= 1;--i)
for(int j = 1;j <= m;++j)
for(int k = 0;k <= 2;++k)
sum[i][j][k] = INF;
sum[n][a][0] = w[n][a];
sum[1][b][1] = w[1][b];
sum[1][c][2] = w[1][c];
dij(n,a,0);dij(1,b,1);dij(1,c,2);
for(int i = n;i >= 1;--i)
for(int j = 1;j <= m;++j)
ans = min(ans,sum[i][j][0]+sum[i][j][1]+sum[i][j][2]-2*w[i][j]);
printf("%lld",ans);
return 0;
}