- 787 K 站中转内最便宜的航班
- 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。
现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cheapest-flights-within-k-stops
解题思路:动态规划,dp[i][k]是指到达i城市至多需要k步的最小费用,明显dp[src][k]=0,0<=k<=K+1,从k=1开始,遍历整个flights,当前航班为flight,如果存在k-1步从src抵达当前航班的起点站flight[0](即费用dp[flight[0]][k-1]不等于无穷大),则更新当前航班终点站flight[1]的费用dp[flight[1]][k] = min(dp[flight[1]][k] , dp[flight[0]][k-1]+ flight[2])。k加一,重复以上步骤,直至k=K+1。最终返回dst的费用,即dp[dst][K+1]。
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+2, INT_MAX));
for(int i =0; i<K+2; ++i){
dp[src][i] = 0;
}
for(int i=1; i<K+2; ++i){
for(auto flight : flights){
if(dp[flight[0]][i-1]!=INT_MAX){
dp[flight[1]][i] = min(dp[flight[1]][i], dp[flight[0]][i-1] + flight[2]);
}
}
}
if(dp[dst][K+1]==INT_MAX) return -1;
return dp[dst][K+1];
}
};