WA两个点,30分
#include<iostream>
#include<cstdio>
#include<queue>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1010;
ll dis[3][N][N],g[N][N],vis[N][N];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node
{
int x,y,stp;
bool operator < (const node &x)const
{
return this->stp>x.stp;
}
};
priority_queue<node>q;
int n,m,a,b,c;
void bfs(int ind,int sx,int sy)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
vis[i][j]=0,dis[ind][i][j]=inf;
while(q.size())q.pop();
q.push((node){sx,sy,0});
int x,y,stp;
while(q.size())
{
x=q.top().x,y=q.top().y,stp=q.top().stp;
q.pop();
if(vis[x][y]||x<1||y<1||x>n||y>m)continue;
vis[x][y]=1;
dis[ind][x][y]=min(dis[ind][x][y],g[x][y]+stp);
for(int i=0;i<4;i++)
q.push((node){x+dir[i][0],y+dir[i][1],dis[ind][x][y]});
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
for(int i=n;i;i--)
for(int j=1;j<=m;j++)
scanf("%lld",&g[i][j]);
bfs(0,n,a);
bfs(1,1,b);
bfs(2,1,c);
ll ans=inf;
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]-2*g[i][j]);
printf("%lld",ans);
return 0;
}/*
5 5 1 2 4
1 8 1 6 6
1 1 1 2 4
8 3 1 2 2
1 2 1 9 1
1 0 9 1 1
*/
求大佬帮忙