#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
};
struct n2{
int x,y;
long long ro;
bool operator <(const n2 &b)const{
return ro>b.ro;
}
};
int n,m,a,b,c,f[1005][1005],top;
long long dis[3][1005][1005],ans=1e18;
bool vis[1005][1005];
vector<node>g[1005][1005];
void dij(int k,int sx,int sy){
priority_queue<n2> heap;
dis[k][sx][sy]=f[sx][sy];
memset(vis,0,sizeof(vis));
vis[sx][sy]=1;
int dx=sx,dy=sy;
heap.push({dx,dy,f[sx][sy]});
for(int i=1;i<n*m;i++){
for(int j=0,px,py;j<g[dx][dy].size();j++){
px=g[dx][dy][j].x,py=g[dx][dy][j].y;
if(dis[k][px][py]>dis[k][dx][dy]+f[px][py]){
dis[k][px][py]=dis[k][dx][dy]+f[px][py];
heap.push({px,py,dis[k][px][py]});
}
}
dx=heap.top().x;
dy=heap.top().y;
heap.pop();
vis[dx][dy]=1;
}
}
int main(){
memset(dis,0x3f,sizeof(dis));
cin>>n>>m>>a>>b>>c;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>f[i][j];
if(i!=1)g[i][j].push_back({i-1,j});
if(i!=n)g[i][j].push_back({i+1,j});
if(j!=1)g[i][j].push_back({i,j-1});
if(j!=m)g[i][j].push_back({i,j+1});
}
}
dij(0,1,a);
dij(1,n,b);
dij(2,n,c);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=min(ans,dis[0][i][j]+dis[1][i][j]+dis[2][i][j]-f[i][j]*2);
}
}
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
};
struct n2{
int x,y;
long long ro;
}heap[4000005];
int n,m,a,b,c,f[1005][1005],top;
long long dis[3][1005][1005],ans=1e18;
bool vis[1005][1005];
vector<node>g[1005][1005];
void Hinsert(n2 x){
heap[++top]=x;
int k=top;
while(k!=1){
if(heap[k].ro<heap[k/2].ro)swap(heap[k],heap[k/2]);
else break;
k/=2;
}
}
void Herase(){
swap(heap[1],heap[top]);
heap[top].x=heap[top].y=heap[top].ro=0x3f3f3f3f;
top--;
int k=1;
while(heap[k].ro>heap[k*2].ro||heap[k].ro>heap[k*2+1].ro){
if(heap[k*2].ro<heap[k*2+1].ro){
swap(heap[k],heap[k*2]);
k*=2;
}else{
swap(heap[k],heap[k*2+1]);
k=k*2+1;
}
}
}
void dij(int k,int sx,int sy){
for(int i=0;i<=4000000;i++)heap[i].x=heap[i].y=heap[i].ro=0x3f3f3f3f3f3f3f;
dis[k][sx][sy]=f[sx][sy];
memset(vis,0,sizeof(vis));
vis[sx][sy]=1;
int dx=sx,dy=sy;
Hinsert({dx,dy,f[sx][sy]});
for(int i=1;i<n*m;i++){
for(int j=0,px,py;j<g[dx][dy].size();j++){
px=g[dx][dy][j].x,py=g[dx][dy][j].y;
if(dis[k][px][py]>dis[k][dx][dy]+f[px][py]){
dis[k][px][py]=dis[k][dx][dy]+f[px][py];
Hinsert({px,py,dis[k][px][py]});
}
}
dx=heap[1].x;
dy=heap[1].y;
Herase();
vis[dx][dy]=1;
}
}
int main(){
memset(dis,0x3f,sizeof(dis));
cin>>n>>m>>a>>b>>c;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>f[i][j];
if(i!=1)g[i][j].push_back({i-1,j});
if(i!=n)g[i][j].push_back({i+1,j});
if(j!=1)g[i][j].push_back({i,j-1});
if(j!=m)g[i][j].push_back({i,j+1});
}
}
dij(0,1,a);
dij(1,n,b);
dij(2,n,c);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=min(ans,dis[0][i][j]+dis[1][i][j]+dis[2][i][j]-f[i][j]*2);
}
}
cout<<ans;
return 0;
}
求助 手打堆MLE+RE STLAC Why?