LeetCode 787 - K 站中转内最便宜的航班

题目描述

787. K 站中转内最便宜的航班

解法:DP(C++)

d p ( k , v ) dp(k, v) dp(k,v)表示最多中转 k k k站由 s r c src src v v v的最低花费,则转移方程为 d p ( k , v ) = m i n ( d p ( k − 1 , v ) , d p ( k − 1 , u ) + w ( u , v ) ) dp(k,v)=min(dp(k-1,v),dp(k-1,u)+w(u,v)) dp(k,v)=min(dp(k1,v),dp(k1,u)+w(u,v))

b a c k u p [ . . . ] backup[...] backup[...]数组主要是用于求 d p ( k − 1 , u ) + w ( u , v ) dp(k-1,u)+w(u,v) dp(k1,u)+w(u,v),避免在一个 d p [ . . . ] dp[...] dp[...]数组里面操作更改了某一状态

class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
        const int INF = 1e9;
        vector<long> dist(n, INF);
        vector<long> backup(n);

        dist[src] = 0;
        for(int i=0;i<=K;i++)
        {
            backup.assign(dist.begin(), dist.end());
            for(auto& flight: flights)
                dist[flight[1]] = min(dist[flight[1]], backup[flight[0]]+flight[2]);
        }
        return dist[dst] == INF?-1:dist[dst];
    }
};