凡科网站建站教程小程序商店

张小明 2026/1/14 2:34:49
凡科网站建站教程,小程序商店,深圳市建设交易中心网站首页,关键词优化需要从哪些方面开展K 站中转内最便宜的航班 问题描述 有 n 个城市#xff0c;编号从 0 到 n - 1。给你一个航班数组 flights#xff0c;其中 flights[i] [from_i, to_i, price_i] 表示从城市 from_i 到城市 to_i 的航班价格为 price_i。 给你三个整数 src#xff08;出发城市#xff09;、…K 站中转内最便宜的航班问题描述有n个城市编号从0到n - 1。给你一个航班数组flights其中flights[i] [from_i, to_i, price_i]表示从城市from_i到城市to_i的航班价格为price_i。给你三个整数src出发城市、dst目的地城市和k最多中转次数返回从src到dst且最多经过 k 次中转的最便宜价格。如果没有这样的路线返回-1。注意中转次数 航班次数 - 1。例如直接飞行0次中转使用1个航班。示例输入: n 4, flights [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src 0, dst 3, k 1 输出: 700 解释: 在最多 1 次中转的情况下最便宜的路线是 0-1-3总费用为 100 600 700。算法思路带限制条件的最短路径问题不能直接使用 Dijkstra 算法Dijkstra 无法处理边数限制。核心中转次数最多 k 次中转意味着最多使用 k1 条边动态规划可以按边数或中转次数进行状态转移方法Bellman-Ford 算法天然支持边数限制动态规划dp[stops][city]表示经过 stops 次中转到达 city 的最小费用BFS 剪枝按层数遍历效率低Bellman-Ford 核心思想初始化起点费用为0其他为无穷大迭代 k1 次最多 k1 条边每次迭代中基于上一轮的结果更新当前轮的最短距离使用临时数组避免在同一轮中多次更新代码实现方法一Bellman-Ford 算法importjava.util.*;classSolution{/** * 使用Bellman-Ford算法解K站中转内最便宜的航班 * * param n 城市数量 * param flights 航班信息数组每个元素为[出发城市, 到达城市, 价格] * param src 出发城市 * param dst 目的地城市 * param k 最多中转次数 * return 最便宜价格如果不可达返回-1 */publicintfindCheapestPrice(intn,int[][]flights,intsrc,intdst,intk){// 初始化距离数组dist[i]表示到达城市i的最小费用int[]distnewint[n];Arrays.fill(dist,Integer.MAX_VALUE);dist[src]0;// Bellman-Ford算法最多进行k1轮松弛操作// 最多k次中转所以最多k1条边for(intstops0;stopsk;stops){// 创建临时数组避免在同一轮中使用更新后的值int[]tempDistArrays.copyOf(dist,n);booleanupdatedfalse;// 遍历所有航班for(int[]flight:flights){intfromflight[0];inttoflight[1];intpriceflight[2];// 如果from城市在上一轮中可达尝试更新to城市的费用if(dist[from]!Integer.MAX_VALUE){intnewCostdist[from]price;if(newCosttempDist[to]){tempDist[to]newCost;updatedtrue;}}}// 如果本轮没有更新提前结束if(!updated){break;}// 更新距离数组disttempDist;}// 返回结果returndist[dst]Integer.MAX_VALUE?-1:dist[dst];}}方法二动态规划classSolution{/** * 使用动态规划解K站中转内最便宜的航班 * * param n 城市数量 * param flights 航班信息 * param src 出发城市 * param dst 目的地城市 * param k 最多中转次数 * return 最便宜价格 */publicintfindCheapestPrice(intn,int[][]flights,intsrc,intdst,intk){// dp[i][j] 表示经过最多i次中转到达城市j的最小费用// i的范围是0到k10次中转到k1次中转int[][]dpnewint[k2][n];// 初始化所有费用设为无穷大for(inti0;ik1;i){Arrays.fill(dp[i],Integer.MAX_VALUE);}// 起点费用为00次中转到达起点for(inti0;ik1;i){dp[i][src]0;}// 动态规划填表for(intstops1;stopsk1;stops){// 继承上一轮的结果不使用新的航班for(intcity0;cityn;city){dp[stops][city]dp[stops-1][city];}// 尝试使用所有航班进行更新for(int[]flight:flights){intfromflight[0];inttoflight[1];intpriceflight[2];// 如果from城市在stops-1次中转内可达if(dp[stops-1][from]!Integer.MAX_VALUE){intnewCostdp[stops-1][from]price;dp[stops][to]Math.min(dp[stops][to],newCost);}}}// 返回最多k次中转即k1条边的结果returndp[k1][dst]Integer.MAX_VALUE?-1:dp[k1][dst];}}方法三Dijkstra 变种带状态importjava.util.*;classSolution{/** * 使用Dijkstra算法的变种状态包含(城市, 中转次数) */publicintfindCheapestPrice(intn,int[][]flights,intsrc,intdst,intk){// 构建邻接表Listint[][]graphnewList[n];for(inti0;in;i){graph[i]newArrayList();}for(int[]flight:flights){graph[flight[0]].add(newint[]{flight[1],flight[2]});}// 优先队列[费用, 城市, 中转次数]PriorityQueueint[]pqnewPriorityQueue((a,b)-a[0]-b[0]);pq.offer(newint[]{0,src,0});// 记录到达每个城市在不同中转次数下的最小费用int[][]minCostnewint[n][k2];for(inti0;in;i){Arrays.fill(minCost[i],Integer.MAX_VALUE);}minCost[src][0]0;while(!pq.isEmpty()){int[]currentpq.poll();intcostcurrent[0];intcitycurrent[1];intstopscurrent[2];// 如果到达目的地返回费用if(citydst){returncost;}// 如果中转次数已达到上限不能继续if(stopsk){continue;}// 遍历邻居for(int[]neighbor:graph[city]){intnextCityneighbor[0];intpriceneighbor[1];intnewCostcostprice;intnewStopsstops1;// 如果找到更优的路径if(newCostminCost[nextCity][newStops]){minCost[nextCity][newStops]newCost;pq.offer(newint[]{newCost,nextCity,newStops});}}}return-1;}}算法分析时间复杂度Bellman-FordO(k × E)其中E是航班数量动态规划O(k × E)Dijkstra变种O(E × k × log(V × k))空间复杂度Bellman-FordO(V)动态规划O(V)Dijkstra变种O(V × k)算法过程n 4, flights [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src 0, dst 3, k 1Bellman-Ford初始化dist [0, ∞, ∞, ∞]第1轮0次中转1条边处理航班[0,1,100]dist[1] min(∞, 0100) 100其他航班的from城市不可达dist [0, 100, ∞, ∞]第2轮1次中转2条边基于第1轮的dist [0, 100, ∞, ∞]处理航班[1,3,600]dist[3] 100 600 700处理航班[1,2,100]dist[2] 100 100 200航班[2,3,200]不能使用因为第1轮中dist[2] ∞所以dist[3] 700测试用例publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例1标准示例int[][]flights1{{0,1,100},{1,2,100},{2,0,100},{1,3,600},{2,3,200}};System.out.println(Test 1: solution.findCheapestPrice(4,flights1,0,3,1));// 700// 测试用例2无法到达int[][]flights2{{0,1,100},{1,2,100}};System.out.println(Test 2: solution.findCheapestPrice(3,flights2,0,2,0));// -1 (需要1次中转但k0)// 测试用例3直接可达int[][]flights3{{0,1,100}};System.out.println(Test 3: solution.findCheapestPrice(2,flights3,0,1,0));// 100// 测试用例4多条路径int[][]flights4{{0,1,100},{0,2,500},{1,2,100}};System.out.println(Test 4: solution.findCheapestPrice(3,flights4,0,2,1));// 200// 测试用例5中转次数为0int[][]flights5{{0,1,100},{1,2,100},{0,2,500}};System.out.println(Test 5: solution.findCheapestPrice(3,flights5,0,2,0));// 500// 测试用例6大价格值int[][]flights6{{0,1,1000000},{1,2,1000000}};System.out.println(Test 6: solution.findCheapestPrice(3,flights6,0,2,1));// 2000000// 测试用例7起点等于终点int[][]flights7{{0,1,100}};System.out.println(Test 7: solution.findCheapestPrice(2,flights7,0,0,0));// 0// 测试用例8复杂的多路径int[][]flights8{{0,1,1},{0,2,5},{1,2,1},{2,3,1}};System.out.println(Test 8: solution.findCheapestPrice(4,flights8,0,3,1));// -1 (需要2次中转)System.out.println(Test 9: solution.findCheapestPrice(4,flights8,0,3,2));// 3 (0-1-2-3)// 测试用例10环路情况int[][]flights10{{0,1,100},{1,2,100},{2,0,100},{1,3,600}};System.out.println(Test 10: solution.findCheapestPrice(4,flights10,0,3,1));// 700}关键点中转次数k次中转 k1条边Bellman-Ford需要执行k1轮临时数组使用临时数组避免在同一轮中多次更新Bellman-Ford算法的核心边界情况处理起点等于终点费用为0无法到达返回-1直接可达1条边0次中转常见问题为什么不能用Dijkstra算法Dijkstra假设一旦找到最短路径就不会被更新这里路径可能更长但中转次数更少需要考虑所有可能性临时数组确保每轮操作只基于上一轮的结果避免在同一轮中使用刚更新的值导致错误的多步更新如何处理负权边Bellman-Ford天然支持负权边
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做卖挖掘机的网站开发游戏需要学什么专业

1.如何使用 JMeter 测试文件上传接口? 回答重点 我们可以使用 JMeter 中的 HTTP Request 采样器来测试文件上传接口。具体步骤如下: 1)启动 JMeter,并创建一个新的 Test Plan。 2)在 Test Plan 下添加一个 Thread Group 以模拟用户行为。 3)在 Thread Group 下添加一个…

张小明 2026/1/10 10:09:28 网站建设

dell网站设计特色国际公司和跨国公司

wxhelper微信Hook终极指南:从零开始掌握PC微信自动化开发 【免费下载链接】wxhelper Hook WeChat / 微信逆向 项目地址: https://gitcode.com/gh_mirrors/wx/wxhelper 想要打造属于自己的微信机器人?wxhelper为你打开了PC端微信自动化开发的大门&…

张小明 2026/1/14 1:53:37 网站建设

汽车用品东莞网站建设哈尔滨网站seo公司

计算机毕业设计少儿体育培训机构管理系统zo1s69 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。双减之后,体育培训成为新风口,家长扎堆给孩子报篮球、游泳…

张小明 2026/1/10 10:09:30 网站建设

揭阳住房和城乡建设厅网站安卓移动端开发

第一章:Open-AutoGLM沉思版下载后性能提升300%?真实压测数据曝光近期,开源社区对“Open-AutoGLM沉思版”的关注度持续升温。该模型在公开发布后宣称通过架构优化与推理加速技术,在标准测试集上实现相较原版高达300%的性能提升。为…

张小明 2026/1/10 10:09:32 网站建设

建个网站多少钱成都设计公司哪家好

在科技飞速发展的今天,“虚拟仿真”这一词汇越来越多地出现在我们的视野中,从高端制造业的研发设计,到日常生活中的游戏体验,似乎都离不开它的身影。那么,虚拟仿真究竟是什么?它如何改变我们的生活与工作&a…

张小明 2026/1/12 18:24:03 网站建设

南京工程建设招聘信息网站企业做网站优点

1.实验目的1.掌握线程的概念及创建方法2.掌握线程互斥锁及条件变量同步机制3.掌握POSIX信号量机制4.掌握生产者消费者原理5.设计程序,两种方法实现多线程生产者消费者同步问题2.实验截图及结果分析(1)实验截图(2)实验结…

张小明 2026/1/13 16:38:44 网站建设