LeetCode 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(k−1,v),dp(k−1,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(k−1,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];
}
};