当前位置: 面试刷题>> 寻找最便宜的航行旅途(最多经过k个中转站) (经典算法题500道)
### 题目描述补充
给定一个包含航班信息的二维数组 `flights`,其中 `flights[i] = [fromi, toi, pricei]` 表示从城市 `fromi` 到城市 `toi` 的航班价格为 `pricei`。此外,给定一个整数 `src` 表示起始城市,一个整数 `dst` 表示目标城市,以及一个整数 `k` 表示最多可以经过的中转站数量(包括起始站和目标站在内,总站点数不超过 `k+1`)。
你需要找到从起始城市 `src` 到目标城市 `dst` 的最便宜旅行方式,并返回所需的最小价格。如果没有可能的旅行方式,则返回 `-1`。
### 示例
```
输入:
flights = [[0,1,100],[1,2,100],[0,2,500]]
src = 0
dst = 2
k = 1
输出: 200
解释:
从城市 0 到城市 2 的最便宜路径是 0 -> 1 -> 2,总价格为 100 + 100 = 200。
```
### PHP 示例代码
```php
function findCheapestPrice($flights, $src, $dst, $k) {
$n = count($flights); // 假设航班数量可以代表城市数量(每个城市至少出现一次)
$dp = array_fill(0, $n, array_fill(0, $k + 2, PHP_INT_MAX)); // dp[i][j] 表示到达城市i且经过j个站点的最小价格
$dp[$src][0] = 0; // 起始城市不需要花费
for ($stops = 1; $stops <= $k + 1; $stops++) {
for ($from = 0; $from < $n; $from++) {
for ($to = 0; $to < $n; $to++) {
// 查找是否存在从 from 到 to 的航班
foreach ($flights as $flight) {
if ($flight[0] == $from && $flight[1] == $to) {
$dp[$to][$stops] = min($dp[$to][$stops], $dp[$from][$stops - 1] + $flight[2]);
}
}
}
}
}
$minPrice = PHP_INT_MAX;
for ($i = 0; $i <= $k + 1; $i++) {
$minPrice = min($minPrice, $dp[$dst][$i]);
}
return $minPrice == PHP_INT_MAX ? -1 : $minPrice;
}
```
### Python 示例代码
```python
def findCheapestPrice(flights, src, dst, k):
n = len(flights)
dp = [[float('inf')] * (k + 2) for _ in range(n)]
dp[src][0] = 0
for stops in range(1, k + 2):
for from_city in range(n):
for to_city, _, price in flights:
if from_city == to_city:
continue
dp[to_city][stops] = min(dp[to_city][stops], dp[from_city][stops - 1] + price)
return min(dp[dst]) if min(dp[dst]) != float('inf') else -1
```
### JavaScript 示例代码
```javascript
function findCheapestPrice(flights, src, dst, k) {
const n = flights.length;
const dp = Array.from({ length: n }, () => Array(k + 2).fill(Infinity));
dp[src][0] = 0;
for (let stops = 1; stops <= k + 1; stops++) {
for (let from = 0; from < n; from++) {
for (const [to, _, price] of flights) {
if (from !== to) {
dp[to][stops] = Math.min(dp[to][stops], dp[from][stops - 1] + price);
}
}
}
}
return dp[dst].includes(Infinity) ? -1 : Math.min(...dp[dst]);
}
```
### 备注
- 以上代码均实现了题目要求的功能,但请注意,这些代码假设了航班数组 `flights` 的长度可以用来近似代表城市的数量,这在实际情况中可能需要根据具体数据结构进行调整。
- 面试时,根据面试官的要求和题目细节,可能还需要考虑边界条件、输入验证等。
- 码小课网站中有更多关于算法和数据结构的内容,可以帮助大家深入学习相关知识。