787. K 站中转内最便宜的航班 图类和边相关的dp

解题思路

  1. 状态定义, d p [ u ] [ v ] [ k ] dp[u][v][k] dp[u][v][k]代表从城市 u u u到达城市 v v v,最多经过 k k k个中转站得到的最小的距离。
  2. 本题中,源城市确定,显然这里上面定义状态的第一维 u u u就不需要了,所以我们的状态 d p [ v ] [ k ] dp[v][k] dp[v][k]代表从城市 s r c src src到达城市 v v v,最多经过 k k k个中转站得到的最小的距离。
  3. 初始状态, d p [ s r c ] [ i ] = 0 , 0 < = i < k dp[src][i]=0,0<=i<k dp[src][i]=0,0<=i<k d p [ f l i g h t s [ i ] [ 1 ] ] [ 0 ] = f l i g h t [ i ] [ 2 ] , 0 < = i < n dp[flights[i][1]][0]=flight[i][2],0<=i<n dp[flights[i][1]][0]=flight[i][2],0<=i<n,其它的设置为 I N T _ M A X INT\_MAX INT_MAX
  4. 最外层循环, 1 < = k < = K 1<=k<=K 1<=k<=K,内层循环,扫描所有的边
  5. 时间复杂度 O ( K ∗ E ) O(K*E) O(KE) E E E为边的个数。
  6. 空间复杂度 O ( n ∗ k ) O(n*k) O(nk),觉得可以和背包问题一样优化到一维。
  7. 官方代码

代码

class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
        vector<vector<int>>dp(n, vector<int>(K+1, INT_MAX));
        for (int i = 0; i <= K; i++){
            dp[src][i] = 0;
        }
        for (vector<int>& flight : flights){
            if (flight[0] == src){
                dp[flight[1]][0] = flight[2];
            }
        }
        for (int i = 1; i <= K; i++){
            int nowBegin = 0;
            int nowEnd = 0;
            for (vector<int> &flight : flights){
                nowBegin = flight[0];
                nowEnd = flight[1];
                if (dp[nowBegin][i - 1] != INT_MAX){
                    dp[nowEnd][i] = min(dp[nowBegin][i - 1] + flight[2], dp[nowEnd][i]);
                }
            }
        }
        return dp[dst][K] == INT_MAX ? -1 : dp[dst][K];

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值