为什么在每次走的时候总路程都要取负数?
  • 板块AT_zone2021_e 潜入
  • 楼主UFOI
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/12 19:59
  • 上次更新2023/11/12 21:30:38
查看原帖
为什么在每次走的时候总路程都要取负数?
777756
UFOI楼主2023/11/12 19:59

可能标题说的不太明确,就是那四个特别长的行中往优先队列里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();
}
2023/11/12 19:59
加载中...