在经过57遍的不懈提交后,我从20分变成30分了,只有#6和#9两个点错了。
那位带佬能帮忙看看嘛。
嘤嘤嘤
#include<bits/stdc++.h>
using namespace std;
unsigned long long dis[1001*1001+1],cnt,minn,ans[1001*1001+1];
int aa[1001][1001],n,m,a,b,c,head[1010*1010+1],l[1001*1001+1];
struct cxk{
long long to,zhi,next;
}e[4001*2001+1];
void add(int p,int y,int z){
cnt++;
e[cnt].to=y;
e[cnt].zhi=z;
e[cnt].next=head[p];
head[p]=cnt;
}
struct node{
int zhi;int xv;
bool operator <(const node &u)const{
return u.zhi<zhi;
}
};
priority_queue<node>q;
int main()
{
minn=pow(2,62)-1;
minn=minn*2;
cin>>n>>m>>a>>b>>c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>aa[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(i!=1)add((i-1)*m+j,(i-2)*m+j,aa[i-1][j]);
if(i!=n)add((i-1)*m+j,i*m+j,aa[i+1][j]);
if(j!=1)add((i-1)*m+j,(i-1)*m+j-1,aa[i][j-1]);
if(j!=m)add((i-1)*m+j,(i-1)*m+j+1,aa[i][j+1]);
}
memset(dis,0x7f,sizeof(dis));
node x;
x.zhi=aa[1][a];
x.xv=a;
q.push(x);
dis[a]=aa[1][a];
while(!q.empty())
{
node x=q.top();
q.pop();
int y=x.xv;
long long z=x.zhi;
if(l[y]==1)continue;
else l[y]=1;
for(int i=head[y];i;i=e[i].next)
{
int too=e[i].to;
if(l[too]==1)continue;
if(z+e[i].zhi<dis[too])
{
dis[too]=z+e[i].zhi;
node o;
o.zhi=dis[too];
o.xv=e[i].to;
q.push(o);
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans[(i-1)*m+j]=ans[(i-1)*m+j]+dis[(i-1)*m+j];
memset(dis,0x7f,sizeof(dis));
memset(l,0,sizeof(l));
x.zhi=aa[n][b];
x.xv=(n-1)*m+b;
q.push(x);
dis[(n-1)*m+b]=aa[n][b];
while(!q.empty())
{
node x=q.top();
q.pop();
int y=x.xv;
long long z=x.zhi;
if(l[y]==1)continue;
else l[y]=1;
for(int i=head[y];i;i=e[i].next)
{
int too=e[i].to;
if(l[too]==1)continue;
if(z+e[i].zhi<dis[too])
{
dis[too]=z+e[i].zhi;
node o;
o.zhi=dis[too];
o.xv=e[i].to;
q.push(o);
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans[(i-1)*m+j]=ans[(i-1)*m+j]+dis[(i-1)*m+j];
memset(dis,0x7f,sizeof(dis));
memset(l,0,sizeof(l));
x.zhi=aa[n][c];
x.xv=(n-1)*m+c;
q.push(x);
dis[(n-1)*m+c]=aa[n][c];
while(!q.empty())
{
node x=q.top();
q.pop();
int y=x.xv;
long long z=x.zhi;
if(l[y]==1)continue;
else l[y]=1;
for(int i=head[y];i;i=e[i].next)
{
int too=e[i].to;
if(l[too]==1)continue;
if(z+e[i].zhi<dis[too])
{
dis[too]=z+e[i].zhi;
node o;
o.zhi=dis[too];
o.xv=e[i].to;
q.push(o);
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
ans[(i-1)*m+j]=ans[(i-1)*m+j]+dis[(i-1)*m+j];
ans[(i-1)*m+j]=ans[(i-1)*m+j]-2*aa[i][j];
minn=min(minn,ans[(i-1)*m+j]);
}
cout<<minn;
}