Link:

传送门

A:

分层图最短路(其实就是最短路转移时多记录一维的数据

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=105;
int n,T,dat[MAXN][MAXN];
ll d[MAXN][MAXN][3];
struct node{int x,y,d,w;};

int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
priority_queue<node> q;
bool operator < (node a,node b){return a.w>b.w;}

int main()
{
    scanf("%d%d",&n,&T);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&dat[i][j]);
    
    memset(d,0x3f,sizeof(d));
    d[1][1][0]=0;
    q.push(node{1,1,0,0});
    while(!q.empty())
    {
        node t=q.top();q.pop();
        if(d[t.x][t.y][t.d]<t.w) continue;
        for(int i=0;i<4;i++)
        {
            int fx=t.x+dx[i],fy=t.y+dy[i],cur=(t.d+1)%3;
            if(fx<1||fy<1||fx>n||fy>n) continue;
            ll cost=t.w+T+(cur==0?dat[fx][fy]:0);
            if(d[fx][fy][cur]>cost)
                d[fx][fy][cur]=cost,q.push(node{fx,fy,cur,cost});
        }
    }
    
    printf("%lld",min(d[n][n][0],min(d[n][n][1],d[n][n][2])));
    return 0;
}
Problem A

相关文章: