题目描述
题干:
有 n 个城市通过一些航班连接。
给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei]
表示该航班都从城市 fromi 开始,以价格 toi 抵达 pricei。
现在给定所有的城市和航班,以及出发城市 src 和目的地 dst
你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜
并返回该价格。 如果不存在这样的路线,则输出 -1。
示例 1:
输入:
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
输出: 200
示例 2:
输入:
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 0
输出: 500
题解思路
返回做多路径下的最少价格,典型的Dijkstra算法,不过还要保证经过的路径最多
这样我们需要采用dp的思想,把每次的状态转移用数组存放起来,至于用二维数组还是两个一维数组均可
我们要记录路过的每两个地点的路径数和他们之间的最少金额,注意不合法的路径返回-1
正确代码
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
final int INF = 10000 * 101 + 1;
int[][] f = new int[k + 2][n];
for (int i = 0; i < k + 2; i++) {
Arrays.fill(f[i], INF);
}
f[0][src] = 0;
for (int t = 1; t <= k + 1; t++) {
for (int[] flight : flights) {
int j = flight[0], i = flight[1], cost = flight[2];
f[t][i] = Math.min(f[t][i], f[t - 1][j] + cost);
}
}
int ans = INF;
for (int t = 1; t <= k + 1; t++) {
ans = Math.min(ans, f[t][dst]);
}
return ans == INF ? -1 : ans;
}
总结
这里用二维数组的方法代替了邻接表或者图的模型,当然可以用链表、树或者堆来实现
如果文章存在问题或者更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见