有 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,如圖中藍色所示
解題思路:這道題可以基於dijkstra演算法來做,求最短路徑的同時限制了中轉次數,因此我們可以用乙個優先佇列來存放每乙個可以經過的站,結構如下:
priorityqueuepq = new priorityqueue((a, b) -> a[0] - b[0]);
int 中存放三個值
1. cost:總共消耗的金錢
2. k:經過中轉站的次數
3. 當前所在中轉站位置
實現的原理為:
考慮上面的圖,假設出發點是0,終點為3,中轉次數為2,這時候最短路徑就是0->2->1->3
當我們將0加入優先佇列時,0會將通過1和通過2所需的花費和中轉次數加入到優先佇列中,如下結構
這時候我們從優先佇列取出的就是這一站,同理,取出這一站後該站會將通過它相鄰站所需的花費以及相關資訊加入到佇列中
,因此,優先佇列可以保證每次從取出的都是最短路徑,但是要注意該題還有中轉次數的限制,因此我們需要乙個map來儲存經過相同次中轉所需的最少花費
如上圖:
0->1->3
0->2->3
這兩條路徑都是通過相同次數的中轉到達目的地的,因此需要乙個map來保證取的最小值
完整**如下:
class solution ); //將出發點加入佇列
hashmapmap = new hashmap(); //儲存出發點經過每乙個中轉站的花費,將k*1000是為了篩選出經過相同次數中轉站花費最少的值,乘於1000是為了避免資料干擾
while(!pq.isempty())
);while(!pq.isempty())
); }}
}return -1;
}
leetcode787 K站中轉內最便宜的航班
有 n 個城市通過 m 個航班連線。每個航班都從城市 u 開始,以 w 抵達 v。現在給定所有的城市和航班,以及出發城市 src 和目的地 dst,你的任務是找到從 src 到 dst 最多經過 k 站中轉的最便宜的 如果沒有這樣的路線,則輸出 1。示例 1 輸入 n 3 edges 0,1,100...
787 K 站中轉內最便宜的航班
有 n 個城市通過一些航班連線。給你乙個陣列 flights 其中 flights i fromi,toi,pricei 表示該航班都從城市 fromi 開始,以 pricei 抵達 toi。現在給定所有的城市和航班,以及出發城市 src 和目的地 dst,你的任務是找到出一條最多經過 k 站中轉的...
K 最鄰近演算法總結
1.基本介紹 k最近鄰 k nearest neighbor,knn 分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居...