LeetCode787K站中轉內最便宜的航班(動態規劃)

題目鏈接leetcode787

在這裏插入圖片描述


思路:首先這題可以bfs做,因爲第一個約束是K中轉站內,即搜K+1層然後鬆弛dist數組,當終點的dist沒有被鬆弛過說明不通。根據這個思路可以設計一個二維狀態dp[i][j]dp[i][j]表示到達j點最多經過i箇中轉站的最少費用,於是狀態轉移方程可以推導爲: dp[i][to]=min(dp[i][to], dp[i-1][from]+w[from][to]),遞推K層即可。注意邊界問題。

一開始想用傳遞閉包做,但傳遞閉包的外層枚舉的k是表示考慮了幾個點而不是第幾層故這種思路是錯誤的!


class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int>>& vect, int src, int dst, int K) {
        vector<vector<int>> dp(K+1, vector<int>(n, INT_MAX-20000)); //dp[k][i]表示從src至多經過k次中轉到達i的最少花費
        n = vect.size();
        for(int i=0; i<=K; ++i) dp[i][src] = 0; //初始化,到達源點經幾次中轉地費用都是0
        for(int i=0; i<n; ++i) if(src == vect[i][0]) dp[0][vect[i][1]] = vect[i][2]; //相鄰的點也不用經過中轉站
        for(int i=1; i<=K; ++i){
            for(int j=0; j<n; ++j) {
                int u = vect[j][0], v = vect[j][1], w = vect[j][2];
                if(dp[i-1][u] + w < dp[i][v]) dp[i][v] = dp[i-1][u] + w; //當前i-1層進行中轉能夠鬆弛則更新
            }
        }
        return dp[K][dst] == INT_MAX-20000 ? -1 : dp[K][dst];
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章