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: 思路:就是要弄明白graph怎么建立,pq里面存什么,怎么进行搜索; graph: HashMap<Integer> 存 from , pq: 存Node Node sort by cost; 搜索:if( step > 0) 继续,if city = dst 表示找到,直接返回当前cost 这个问题是关于图论和优先队列(Priority Queue)在寻找最短路径中的应用,具体是一个寻找最便宜航班的算法。给定一个有向图,表示各个城市之间的航班及其费用,我们要找出从源城市(src)到目标城市(dst)的最便宜路径,且允许最多经过K次转机。 我们需要构建图的邻接表表示。在这个问题中,图用一个HashMap<Integer, HashMap<Integer, Integer>>来表示,其中外层的HashMap以城市ID为键,内层的HashMap存储了可以从该城市飞往哪些其他城市以及对应的费用。例如,edges = [[0,1,100],[1,2,100],[0,2,500]]表示有三个航班:从0飞往1费用100,从1飞往2费用100,从0飞往2费用500。 接下来,我们使用优先队列(Priority Queue)来存储节点(Node),这个队列按照费用(cost)进行排序。Node类包含三个属性:cost(当前路径总费用)、city(当前所在城市)和step(剩余可转机次数)。队列中存储的Node初始为源城市,费用为0,剩余转机次数为K+1。 算法的核心是遍历优先队列。当队列不为空时,我们取出当前费用最低的Node。如果当前城市等于目标城市,说明找到了一条到达目标城市的路径,返回当前费用。否则,如果剩余转机次数大于0,我们可以继续探索。我们获取当前城市的所有邻居,并为每个邻居创建一个新的Node,费用加上飞往邻居的费用,城市设为邻居,剩余转机次数减1,然后将这些新Node加入优先队列。 如果遍历完优先队列仍没有找到目标城市,说明没有符合条件的路径,返回-1。 在提供的Solution类中,定义了一个内部类NodeComparator,用于比较Node对象的费用,实现升序排列。findCheapestPrice方法实现了上述逻辑,首先检查输入参数的有效性,然后构建图的邻接表,接着初始化优先队列并开始搜索。这个算法的时间复杂度是O((E+V)logV),其中E是边的数量,V是顶点(城市)的数量,因为每个节点最多入队和出队一次,而每次操作都有logV的时间复杂度。 总结来说,"Cheapest Flights Within K Stops"问题要求我们在有限次转机的条件下找到从源城市到目标城市的最低费用路径。解决这个问题的关键在于构建图的邻接表、使用优先队列按费用排序以及进行广度优先搜索。通过这种方式,我们可以有效地找到满足条件的最便宜航班。
- 粉丝: 4
- 资源: 910
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助