zoukankan      html  css  js  c++  java
  • 787. Cheapest Flights Within K Stops

    package LeetCode_787
    
    import java.util.*
    import kotlin.collections.ArrayList
    import kotlin.collections.HashMap
    
    /**
     * 787. Cheapest Flights Within K Stops
    https://leetcode.com/problems/cheapest-flights-within-k-stops/description/
    
    There are n cities connected by m flights. Each flight 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
     * */
    class Solution {
        /**
         * solution:bfs, Time complexity:O(K*n^2), Space complexity:O(n)
         * */
        fun findCheapestPrice(n: Int, flights: Array<IntArray>, src: Int, dst: Int, K: Int): Int {
            //create graph
            val graph = HashMap<Int, ArrayList<Pair<Int, Int>>>()
            for (flight in flights) {
                val form = flight[0]
                val to = flight[1]
                val cost = flight[2]
                if (!graph.contains(form)) {
                    graph.put(form, ArrayList())
                }
                graph.get(form)?.add(Pair(to, cost))
            }
            var result = Int.MAX_VALUE
            var step = 0
            val queue = LinkedList<Pair<Int, Int>>()
            //represent need 0 to start
            queue.offer(Pair(src, 0))
            while (queue.isNotEmpty()) {
                //compare with all node
                for (i in 0 until queue.size) {
                    val top = queue.pop()
                    val curLocation = top.first
                    val cost = top.second
                    if (curLocation == dst) {
                        result = Math.min(result, cost)
                    }
                    val list = graph.get(curLocation)
                    if (list != null) {
                        for (item in list) {
                            //current total cost to next location
                            if (cost + item.second > result) {
                                continue//purnning
                            }
                            queue.offer(Pair(item.first, cost + item.second))
                        }
                    }
                }
                if (step++ > K) {
                    break
                }
            }
            return if (result == Int.MAX_VALUE) -1 else result
        }
    }
  • 相关阅读:
    swiper把左右箭头放到外侧
    vue复制地址栏链接:clipboard
    移动端适配rem.js
    vue登录弹框
    vue使用vue-aplayer(还用了SiriWave波形动画插件)
    vue 锚点定位,并平滑过渡
    vue引入scss报错:scss版本太高
    Kylin |3.Cube的优化
    Kylin |2.ModuleProject
    算法| 高级动态规划
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13140321.html
Copyright © 2011-2022 走看看