30pts求助
查看原帖
30pts求助
235589
霜羽楼主2020/9/26 20:35

思路堆优dij,WA#5#6#9

#include<cstdio>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
#define ll long long
const ll INF = 2000000009;
struct node{
    int x;
    int y;
    ll sum;
    bool operator <(const node &p)const{
        return p.sum < sum;
    }
};
priority_queue<node>q;
int vis[1005][1005][4],n,m,a,b,c;
ll sum[1005][1005][4],w[1005][1005];
ll ans = 2000000009;
ll min(ll x,ll y){return x > y?y:x;}
int s[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};

void dij(int x,int y,int z){
    q.push({x,y,sum[x][y][z]});
    while(!q.empty()){
        node p = q.top();
        q.pop();
        if(vis[p.x][p.y][z])continue;
        vis[p.x][p.y][z] = 1;
        for(int i = 0;i <= 3;++i){
            int tx = p.x + s[i][0];
            int ty = p.y + s[i][1];
            if(tx <= 0 || ty <= 0 || tx > n ||ty > m)continue;
            if(sum[p.x][p.y][z] + w[tx][ty] < sum[tx][ty][z]){
                sum[tx][ty][z] = sum[p.x][p.y][z] + w[tx][ty];
                q.push({tx,ty,sum[tx][ty][z]});
            }
        }
    }
    return;
}
int main(){
    scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
    for(int i = n;i >= 1;--i)
        for(int j = 1;j <= m;++j)
            scanf("%lld",&w[i][j]);
    for(int i = n;i >= 1;--i)
        for(int j = 1;j <= m;++j)
            for(int k = 0;k <= 2;++k)
                sum[i][j][k] = INF;
    sum[n][a][0] = w[n][a];
    sum[1][b][1] = w[1][b];
    sum[1][c][2] = w[1][c];
    dij(n,a,0);dij(1,b,1);dij(1,c,2);
    for(int i = n;i >= 1;--i)
        for(int j = 1;j <= m;++j)
            ans = min(ans,sum[i][j][0]+sum[i][j][1]+sum[i][j][2]-2*w[i][j]);
    printf("%lld",ans);
    return 0;
}
2020/9/26 20:35
加载中...