LeetCode——787. K 站中转内最便宜的航班(Java)

题目描述

题干:
有 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;
    }

总结

这里用二维数组的方法代替了邻接表或者图的模型,当然可以用链表、树或者堆来实现

如果文章存在问题或者更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-08-24 09:00  21岁还不是架构师  阅读(244)  评论(0编辑  收藏  举报