leetcode_787【K 站中轉內最便宜的航班】


有 n 個城市通過 m 個航班連接。每個航班都從城市 u 開始,以價格 w 抵達 v

現在給定所有的城市和航班,以及出發城市 src 和目的地 dst,你的任務是找到從 src 到 dst 最多經過 k 站中轉的最便宜的價格。 如果沒有這樣的路線,則輸出 -1

示例 1:
輸入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
輸出: 200
解釋: 
城市航班圖如下

從城市 0 到城市 2 在 1 站中轉以內的最便宜價格是 200,如圖中紅色所示。
示例 2:
輸入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 0
輸出: 500
解釋: 
城市航班圖如下

從城市 0 到城市 2 在 0 站中轉以內的最便宜價格是 500,如圖中藍色所示。

提示:

  • n 范圍是 [1, 100],城市標簽從 0 到 n - 1.
  • 航班數量范圍是 [0, n * (n - 1) / 2].
  • 每個航班的格式 (src, dst, price).
  • 每個航班的價格范圍是 [1, 10000].
  • k 范圍是 [0, n - 1].
  • 航班沒有重復,且不存在環路
#define INF 0xfffffff
class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int> >& flights, int src, int dst, int K) {
        
        int dp[n][K+2];
        //dp[i][k]表示經過k個中轉站到達i的最少花費
        for(int i=0; i<n; i++){
            for(int j = 0; j <= K+1; j++){
                dp[i][j] = INF;
            }
        }
        //dp[src][k]置為0是為了所有其實狀態都從起點開始轉移
        for(int k = 0; k <= K+1; k++){
            dp[src][k] = 0;
        }
      //因為需要遞推0-K的情況,但是k-1會越界,所以向后推一下,遞推1 - K+1的結果
        for(int k =1; k<=K+1; k++){
            for(vector<vector<int> >::iterator flight=flights.begin(); flight != flights.end(); flight++){
                int st = (*flight)[0];
                int en = (*flight)[1];
                int price = (*flight)[2];
                if(dp[st][k-1] != INF)
                    dp[en][k] = min(dp[en][k], dp[st][k-1] + price);
            }
        }
        return dp[dst][K+1]==INF? -1 : dp[dst][K+1];
    }
};            

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM