leetcode787 K站中轉內最便宜的航班

2021-10-07 10:51:34 字數 2311 閱讀 9072

有 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...