leetcode 1631. 最小体力消耗路径 (两点之间花费是差的绝对值 求最短路dijkstra)

3 篇文章 0 订阅

题目
在这里插入图片描述在这里插入图片描述

class Solution {
public:
    struct Edge{int to,len,nex;}*edge;int *head,tot=0;
    void add(int from,int to,int len){
        edge[++tot]=(Edge){to,len,head[from]},head[from]=tot;
        edge[++tot]=(Edge){from,len,head[to]},head[to]=tot;
    }
    #define INF 0x3f3f3f3f
    typedef pair<int,int> pi;
    priority_queue<pi,vector<pi>,greater<pi> >q;int* d;
    void dijkstra(int s){
        q.push({0,s}),d[s]=0;
        while(!q.empty()){
            int x=q.top().second;q.pop();
            for(int i=head[x];i;i=edge[i].nex){
                int y=edge[i].to,l=edge[i].len;
                if(d[y]>max(d[x],l)) d[y]=max(d[x],l),q.push({d[y],y});
            }
        }
    }
    int minimumEffortPath(vector<vector<int>>& a) {
        int n=a.size(),m=a[0].size();
        head=new int[n*m],edge=new Edge[n*m*4],d=new int[n*m];
        for(int i=0;i<n*m;++i) head[i]=0;
        for(int i=0;i<n*m*4;++i) edge[i].nex=0;
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j){
                if(i<n-1) add(i*m+j,i*m+j+m,abs(a[i][j]-a[i+1][j]));
                if(j<m-1) add(i*m+j,i*m+j+1,abs(a[i][j]-a[i][j+1]));
                d[i*m+j]=INF;
            }
        }
        dijkstra(0);
        return d[n*m-1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值