可能标题说的不太明确,就是那四个特别长的行中往优先队列里push的部分,我最开始没有写负数,样例过不了,看第一篇题解这么写的,我也就这么写了,过了,想知道为什么。第一篇题解貌似没给出详细解释,最后一篇题解好像又没加这个东西。
#include<bits/stdc++.h>
using namespace std;
int n,m,a[501][501],b[501][501],dis[501][501],vis[501][501];
priority_queue<pair<int,pair<int,int> > >q;
void bfs(){
memset(dis,0x3f,sizeof dis);
dis[1][1]=0;
q.push({0,{1,1}});
while(q.size()){
int x=q.top().second.first,y=q.top().second.second;
q.pop();
if(x==n&&y==m){
//for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) cout<<dis[i][j]<<" "; cout<<endl;}
printf("%d",dis[x][y]);
return;
}
if(vis[x][y]) continue;
vis[x][y]=1;
if(y<m&&dis[x][y+1]>dis[x][y]+a[x][y]) dis[x][y+1]=dis[x][y]+a[x][y],q.push({-(dis[x][y]+a[x][y]),{x,y+1}});
if(y>=2&&dis[x][y-1]>dis[x][y]+a[x][y-1]) dis[x][y-1]=dis[x][y]+a[x][y-1],q.push({-(dis[x][y]+a[x][y-1]),{x,y-1}});
if(x<n&&dis[x+1][y]>dis[x][y]+b[x][y]) dis[x+1][y]=dis[x][y]+b[x][y],q.push({-(dis[x][y]+b[x][y]),{x+1,y}});
for(int i=x-1;i>=1;i--) if(dis[i][y]>dis[x][y]+1+x-i) dis[i][y]=dis[x][y]+1+x-i,q.push({-(dis[x][y]+1+x-i),{i,y}});
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<m;j++) cin>>a[i][j];
for(int i=1;i<n;i++) for(int j=1;j<=m;j++) cin>>b[i][j];
bfs();
}