【leetcode】787.k站中转内最便宜的航班

题目

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。
现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。
image.png

思路

使用动态规划 将大问题分解成小问题 具体解题思路如下图

![0df823ea8d3f1dd4ff2355c1e82f16b.jpg](https://img-blog.csdnimg.cn/img_convert/a565816faaf293abfee1a1ab6ca86fc9.jpeg在这里插入图片描述

代码

class Solution {
    public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
        // dp[i][j] 表示经过i次航班飞行 从起点得到j点的最小花费
        // 因为最多经过k个中转点那么就相当于最多飞k+1次航班
        int[][] dp=new int[k+2][n];
        // 根据题目中给出的数据范围,最多搭乘航班的次数不超过101,每次航班花费不超过10的四次方 设置出的最大值
        // 如果初始设置为整数的最大值 加法的时候会溢出
        for(int i=0;i<k+2;i++){
            Arrays.fill(dp[i],10000 * 101 + 1);
        }
        // 一次都不飞 那么起点到起点的最小花费就是0 起点到其他的最小花费就是无穷(因为是要求最小 所以初始化是最大值)
        dp[0][src]=0;
        // t=1 是因为不飞的时候的答案都已经知道了
        for(int t=1;t<k+2;t++){
            for(int z=0;z<flights.length;z++){
                int v1=flights[z][0];
                int v2=flights[z][1];
                int cost=flights[z][2];
                //dp[t-1][v1]+cost 的意思就是从起飞点经过t-1次飞到v1,再从v1飞到V2
                dp[t][v2]=Math.min(dp[t][v2],dp[t-1][v1]+cost);
            }
        }
        int max=10000 * 101 + 1;;
        for(int t=1;t<k+2;t++){
            max=Math.min(max,dp[t][dst]);
        }
        if(max==10000 * 101 + 1){
            return -1;
        }else{
            return max;
        }
    }
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值