题目

n个城市,想求从src到dist的最廉价机票

有中转站数K的限制,即如果k=5,中转10次机票1000,中转5次机票2000,最后返回2000

There are n cities connected by some number of flights. You are given an array flights where flights[i] = [fromi, toi, pricei] indicates that there is a flight from city fromi to city toi with cost pricei.

You are also given three integers srcdst, and k, return the cheapest price from src to dst with at most k stops. If there is no such route, return -1.

Example 1:

Input: n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 1
Output: 200
Explanation: The graph is shown.
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, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 0
Output: 500
Explanation: The graph is shown.
The cheapest price from city 0 to city 2 with at most 0 stop costs 500, as marked blue in the picture.

Constraints:

  • 1 <= n <= 100
  • 0 <= flights.length <= (n * (n - 1) / 2)
  • flights[i].length == 3
  • 0 <= fromi, toi < n
  • fromi != toi
  • 1 <= pricei <= 104
  • There will not be any multiple flights between two cities.
  • 0 <= src, dst, k < n
  • src != dst

思路

和https://www.cnblogs.com/inku/p/15622556.html类似

这题多了一个stepCheck,check中转的次数

dijsktra+优先队列

代码

class Solution {
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
int[][] adj=new int[n][n];
for(int[] flight_line:flights){
//flighr_line: {from,to,money}
adj[flight_line[0]][flight_line[1]]=flight_line[2];
} int[] cost=new int[n];
int[] stepCheck=new int[n];
Arrays.fill(cost,Integer.MAX_VALUE);
Arrays.fill(stepCheck,Integer.MAX_VALUE);
cost[src] = 0;
stepCheck[src] = 0; //int[] cur position,cost,stops
PriorityQueue<int[]> pq=new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1]-o2[1];
}
});
//pq.add(new int[]{0,0,1}); 错误!
pq.offer(new int[]{src, 0, 0});//起点不一定是0,本身不算中转 while (!pq.isEmpty()){
int[] curPos=pq.poll();
int curNode=curPos[0];
int curCost=curPos[1];
int curStop=curPos[2];
if(curNode==dst)
return curCost;
if(curStop==k+1)
continue; for(int i=0;i<n;i++){
//两地有机票
if(adj[curNode][i]>0){ int cost_try=adj[curNode][i]+curCost;
if(cost_try<cost[i]){
cost[i]=cost_try;
pq.offer(new int[]{i,cost_try,curStop+1});//便宜的情况,加入
}
else if(curStop<stepCheck[i]){
pq.offer(new int[]{i,cost_try,curStop+1
});//没便宜,但站数更少的情况,也加入
}

stepCheck[i]=curStop;//本身不算stop
}
}
}
return cost[dst]==Integer.MAX_VALUE?-1:cost[dst];
}
}

疑问

                    else if(curStop<stepCheck[i]){
pq.offer(new int[]{i,cost_try,curStop+1
});//没便宜,但站数更少的情况,也加入
}

没便宜(cost更多),但站数更少的情况下虽然加入了,但因优先队列是按cost排序,那岂不是永远取不到?它的意义?

A:取得到,先加进去再说。虽然当前cost多,但后面的cost可能极小,成为最终解的一部分



[Leetcode 787]中转K站内最便宜机票的更多相关文章

  1. LeetCode——787. K 站中转内最便宜的航班

    有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 ...

  2. Java实现 LeetCode 787 K 站中转内最便宜的航班(两种DP)

    787. K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是 ...

  3. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

  4. leetcode 787. K 站中转内最便宜的航班

    问题描述 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst ...

  5. 【力扣】787. K 站中转内最便宜的航班加权——有向图最短路径

    前言 我感觉这题比较有代表性,所以记录一下,这题是加权有向图中求最短路径的问题. 题目 787. K 站中转内最便宜的航班 动态规划 假设有一条路径是[src, i, ..., j, dst],解法一 ...

  6. [Swift]LeetCode787. K 站中转内最便宜的航班 | Cheapest Flights Within K Stops

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

  7. leetcode_787【K 站中转内最便宜的航班】

    有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 ...

  8. Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  9. Lucene.net站内搜索—1、SEO优化

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  10. 1.PHP站内搜索 分类: PHP开发实例 2015-07-31 22:48 4人阅读 评论(0) 收藏

    PHP站内搜索:多关键字.加亮显示 1.SQL语句中的模糊查找 $sql = "SELECT * FROM `message` WHERE `content`like '%$k[0]%' a ...

随机推荐

  1. 根据pid定时监控CPU使用率和内存使用率并输出到文件 (windows和linux跨平台可用)

    有时服务器运维中,某些程序员的应用发布后完全不管CPU和内存的使用率,只觉得代码能运行就行了,这样给我们运维人员经常造成困扰: 比如我在zabbix平台中就经常监测到凌晨1~3~5点时候突然CPU飙升 ...

  2. 几十行代码实现简易版koa~

    application.js const http = require("http")// 洋葱模型 function compose(middleware){ return fu ...

  3. Java 分布式锁实现的一些实践

    近期换工作,闲下来有点时间写点东西,在这里分享一些心得体会 背景:我们在做后端开发时,无法避免的会遇到一些一致性问题,有时候我们前端的小伙伴或者rpc接口的调用方,在很短的时间间隔内给我们相同的请求, ...

  4. Dynamics CRM 安全模型的性能问题

    性能问题对系统的影响可以是致命性的,一旦不重视,在不久的将来随时可能爆发,导致系统卡顿甚至无法操作,即时重启也无济于事:甚至极其难以发现.这里为自己记录一下过往的经验.系统一开始的设计,很大程度上决定 ...

  5. cximage第一讲demo.cpp

    使用流程可参考: https://blog.csdn.net/wxc237786026/article/details/41171079 BOOL CDemoApp::InitInstance() { ...

  6. LaTex【五】latex导入中文包,支持中文显示

    \documentclass{article} \usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gbsn} 中文样例,UTF-8编码,字 ...

  7. 记一次SpringBoot整合Redis的Bug

    SpringBoot整合Redis遇见的坑 <!--Redis配置开始--> <dependency> <groupId>org.springframework.b ...

  8. hashtable被弃用了

      Hashtable的作者:HashMap的作者:Hash Map的作者比Hashtable的作者多了著名顶顶的并发大神Doug Lea.他写了util.concurrent包.著有并发编程圣经Co ...

  9. Morris遍历以及Morris前序中序后序遍历实现

    #include<iostream> using namespace std; struct TreeNode{ int val; TreeNode* right; TreeNode* l ...

  10. <连城诀>剧情大纲+随笔

    --剧情还是偷个懒,从百度百科抄袭一下,红色字体为补充和说明   在湘西沅陵南郊的麻溪乡下,三间小屋之前的晒谷场上,隐居此处多年的剑术名家"铁索横江"戚长发,看着徒弟狄云与女儿戚芳 ...