码迷,mamicode.com
首页 > 其他好文 > 详细

787. Cheapest Flights Within K Stops

时间:2018-11-06 11:05:21      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:ble   while   nbsp   default   ems   quick   tar   ISE   lookup   

There are n cities connected by m flights. Each fight starts from city u and arrives at v with a price w.
Now given all the cities and flights, together with starting city src and the destination dst, your task is to find the cheapest price from src to dst with up to k stops. If there is no such route, output -1.
Example 1:
Input: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
Output: 200
Explanation: 
The graph looks like this:
?

The cheapest price from city 0 to city 2 with at most 1 stop costs 200, as marked red in the picture.
Example 2:
Input: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 0
Output: 500
Explanation: 
The graph looks like this:
?

The cheapest price from city 0 to city 2 with at most 0 stop costs 500, as marked blue in the picture.











https://www.youtube.com/watch?v=FSm1zybd0Tk


https://www.jianshu.com/p/8a6bcb85ce0e
https://www.youtube.com/watch?v=obWXjtg0L64

Idea
It happen to be the same idea of Dijkstra‘s algorithm, but we need to keep the path while explore the grape.
https://leetcode.com/problems/cheapest-flights-within-k-stops/discuss/115541/JavaPython-Priority-Queue-Solution

 Single-Source Shortest Paths Problem
https://www.youtube.com/watch?time_continue=183&v=Aa2sqUhIn-E


https://www.youtube.com/watch?v=GazC3A4OQTE


// need to go thru an example , other’s code 

public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
    // prices map, baically convert the int[][] flights into a hashmap for quick lookup of edges and costs 
        Map<Integer, Map<Integer, Integer>> prices = new HashMap<>(); // key : node1 value : map<key: node2, value:  cost from node1 to node2>
        for (int[] f : flights) {
            if (!prices.containsKey(f[0])) prices.put(f[0], new HashMap<>()); 
            prices.get(f[0]).put(f[1], f[2]);
        }
        Queue<int[]> pq = new PriorityQueue<>((a, b) -> (Integer.compare(a[0], b[0])));
        pq.add(new int[] {0, src, k + 1}); // (cost from source node, current city, how many stops we can stop by) stops = k + 1
        while (!pq.isEmpty()) {
            int[] top = pq.remove();
            int price = top[0];
            int city = top[1];
            int stops = top[2];
            if (city == dst) return price; // how to guarentee this is it 
            if (stops > 0) { // stops > 0, still can stop somewhere 
                Map<Integer, Integer> adj = prices.getOrDefault(city, new HashMap<>()); // get its nei node,and costs from this current node to the nei node 
                for (int a : adj.keySet()) {
                    pq.add(new int[] {price + adj.get(a), a, stops - 1}); // add all it‘s nei cost from source node, nei node, stops 
                }
            }
        }
        return -1;
    }

 

787. Cheapest Flights Within K Stops

标签:ble   while   nbsp   default   ems   quick   tar   ISE   lookup   

原文地址:https://www.cnblogs.com/tobeabetterpig/p/9913118.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!