领扣LintCode算法问题答案-1029. 寻找最便宜的航行旅途(最多经过k个中转站)

领扣LintCode算法问题答案-1029. 寻找最便宜的航行旅途(最多经过k个中转站)

1029. 寻找最便宜的航行旅途(最多经过k个中转站)

描述

有n个城市被一些航班所连接。每个航班 (u,v,w) 从城市u出发,到达城市v,价格为w。

给定城市数目 n,所有的航班flights。你的任务是找到从起点src到终点站dst的最便宜线路的价格,而旅途中最多只能中转K次。

如果没有找到合适的线路,返回 -1。

  • 总城市数 n 在 1-100 之间,每个城市被标号为 0 到 n-1。
  • 航线的总数在 0 到 n * (n - 1) / 2 之间
  • 每条航线会被以 [出发站,终点站,价格] 的形式展现。
  • 每条航线的价格都在 1-10000之间。
  • 中转站的总数限制范围为 0 到 n-1 之间。
  • 不会有重复或者自环航线出现

样例 1:

输入: 
	n = 3,
	flights = [[0,1,100],[1,2,100],[0,2,500]],
	src = 0, dst = 2, K = 0
输出: 
	500

样例 2:

输入: 
	n = 3,
	flights = [[0,1,100],[1,2,100],[0,2,500]],
	src = 0, dst = 2, K = 1
输出: 
	200

原题链接点这里

题解

public class Solution {
    /**
     * @param n: a integer
     * @param flights: a 2D array
     * @param src: a integer
     * @param dst: a integer
     * @param K: a integer
     * @return: return a integer
     */
    public int findCheapestPrice(int n, int[][] flights, int src, int dst, int K) {
        // write your code here
        Map<Integer, List<int[]>> map = new HashMap<>();
        for (int[] flight : flights) {
			List<int[]> fs = map.get(flight[0]);
			if (fs == null) {
				fs = new ArrayList<>();
				map.put(flight[0], fs);
			}
			fs.add(flight);
		}

		int[] dp = new int[n];
		Arrays.fill(dp, -1);
		for (int[] f : map.get(src)) {
			int d = f[1];
			int p = f[2];
			if (dp[d] == -1
					|| p > dp[d]) {
				dp[d] = p;
			}
		}
		for (int j = 0; j < K ; j++) {
			for (int i = 0; i < n; i++) {
				if (dp[i] > 0) {
					List<int[]> fs =  map.get(i);
					if (fs != null) {
						for (int[] f : fs) {
							int d = f[1];
							int p = f[2] + dp[i];
							if (dp[d] == -1
								|| p < dp[d]) {
								dp[d] = p;
							}
						}
					}
				}
			}
		}

		return dp[dst];
	}
}

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页