其他分享
首页 > 其他分享> > LeetCode 1368. 使网格图至少有一条有效路径的最小代价【最短路】

LeetCode 1368. 使网格图至少有一条有效路径的最小代价【最短路】

作者:互联网

传送门

题解

题目说可以花费代价 \(1\) 调整方向,换个意思就是说,
如果沿着原方向走,代价为 \(0\),否则代价为 \(1\),求从点 \((0,0)\) 到点 \((n-1,m-1)\) 的最小代价,
这其实就是个最短路问题了

代码

class Solution {
public:
    int n,m,f[110][110],dis[110][110],vis[110][110];
    int d[5][2]={{},{0,1},{0,-1},{1,0},{-1,0}};
    struct Turp{
        int x,y,w;
        friend bool operator < (const Turp &a,const Turp &b){
            return a.w>b.w;
        }
    };
    priority_queue<Turp> pq;
    
    int minCost(vector<vector<int>>& grid) {
        n=grid.size(),m=grid[0].size();
        memset(dis,0x3f,sizeof(dis));
        dis[0][0]=0;
        pq.push((Turp){0,0,0});
        while(!pq.empty()){
            int ux=pq.top().x,uy=pq.top().y;pq.pop();
            if(vis[ux][uy]) continue;
            vis[ux][uy]=1;
            for(int i=1;i<=4;i++){
                int vx=ux+d[i][0],vy=uy+d[i][1],len=(i!=grid[ux][uy]);
                if(vx<0||vx==n||vy<0||vy==m) continue;
                if(dis[vx][vy]>dis[ux][uy]+len){
                    dis[vx][vy]=dis[ux][uy]+len;
                    pq.push((Turp){vx,vy,dis[vx][vy]});
                }
            }
        }
        return dis[n-1][m-1];
    }
};

标签:pq,uy,int,网格,Turp,110,LeetCode,1368,dis
来源: https://www.cnblogs.com/BakaCirno/p/12421107.html