有 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,如圖中紅色所示。
方法一:
建立乙個結構統計圖的資訊,然後使用佇列結構收集當前能夠到達的城市,遍歷這些城市,找到所能到達的下乙個城市,以此類推。
// 建立乙個資料結構,用來儲存當前城市能夠到達的城市編號,航班金錢,以及到達城市的數量
struct city
;typedef pair<
int,
int> p;
class
solution
// 記錄飛到某個城市i的最低金額
unordered_map<
int,
int> hasvisited;
hasvisited[src]=0
;// 當前可選擇起飛的城市
queue
fly;
fly.
push()
;int res = int_max;
// 當前仍有可以起飛的城市,或者仍然可以繼續中轉
while
(!fly.
empty()
&& k >=0)
// 將當前城市的資訊放入佇列中
tmp.
push()
;}} fly = tmp;
}return res == int_max ?-1
: res;}}
;
方法二:
回溯。同樣建立乙個圖記錄航班資訊,同時記錄哪些城市已經遍歷過(遍歷過的城市,再次抵達只會使得總金額上公升,因此沒必要再經過)。
遍歷所有城市,如果某個城市沒有去過,且能從當前城市直接飛過去,則遞迴訪問該城市。
class
solution
vector<
bool
>
hasvisited
(n,false);
hasvisited[src]
=true
;dfs
(graph, hasvisited, k, dst, src,
0, n)
;return res;
}void
dfs(vector
int>>
& graph, vector<
bool
>
& hasvisited,
int curk,
int dst,
int curdst,
int cost,
int n)
if(curk <
0|| cost > res)
return
;for
(int i =
0; i < n;
++i)
}return;}
};
方法三:
動態規劃。dp[k][i]表示能夠中轉k次的情況下,到達i的最少費用。
假設航班f從i–>j,且dp[k-1][i]!=int_max,表示中轉k-1次情況下從src出發能夠到達i,則通過該航班,中轉k次情況下能夠從i到j。
class
solution}}
return dp.
back()
[dst]
== int_max ?-1
: dp.
back()
[dst];}
};
這道題應該無法將二維陣列轉成一維陣列,因為dp[k][f[1]] = min(dp[k][f[1]], dp[k - 1][f[0]] + f[2])中,不確定f[1]和f[0]的位置關係。 787 K 站中轉內最便宜的航班
有 n 個城市通過一些航班連線。給你乙個陣列 flights 其中 flights i fromi,toi,pricei 表示該航班都從城市 fromi 開始,以 pricei 抵達 toi。現在給定所有的城市和航班,以及出發城市 src 和目的地 dst,你的任務是找到出一條最多經過 k 站中轉的...
leetcode 加油站 題解
在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas i 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i 1 個加油站需要消耗汽油 cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 1。說明 如果...
Leetcode 最小K個數
思路 基於快排改進 選取arr 0 作為基準值,tmp arr 0 排序後,返回tmp的下標index 此時,arr index 左側的值都小於tmp,右側的值都大於tmp。如果k index,那麼從起始點0到下標index 1的值就為最小的k個數,如果k index,說明k個數在區間 0,inde...