题目描述:

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。

现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cheapest-flights-within-k-stops
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


package leetcode;

import java.util.ArrayList;
import java.util.List; /*
Author:Samba
Time :2021年8月24日
Data:下午10:17:04
*/
//K 站中转内最便宜的航班
public class t787 {
public static void main(String[] args) {
Solution787 S = new Solution787();
int[][] test = {{3,4,4},{2,5,6},{4,7,10},{9,6,5},{7,4,4},{6,2,10},{6,8,6},{7,9,4},{1,5,4},{1,0,4},{9,7,3},{7,0,5},{6,5,8},{1,7,6},{4,0,9},{5,9,1},{8,7,3},{1,2,6},{4,1,5},{5,2,4},{1,9,1},{7,8,10},{0,4,2},{7,2,8}}
;
int result = S.findCheapestPrice(100,test,6, 0, 7);
System.out.println(result);
}
} class Solution787 {
private int minResult;
private int[][] flights;
private int n;
private int k;
private int dst;
//判断是否已经抵达过
public static boolean isArrived(int Node,List<Integer> arrivedNodes) {
boolean flag = false;
for(int i:arrivedNodes) {
if(i==Node) flag = true;
}
return flag;
}
//起始地点为s且到达地点没有飞过的数组
public List<int[]> fromS(int s,List<Integer> arrivedNodes) {
List<int[]> result = new ArrayList<int[]>();
for(int[] flight:flights) {
if(flight[0] == s&&!isArrived(flight[1],arrivedNodes)) {
result.add(flight);
}
}
return result;
}
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
this.flights = flights;
this.n = n;
this.k = k;
this.dst = dst;
this.minResult = Integer.MAX_VALUE;
List<Integer> arrivedNodes = new ArrayList<Integer>();
int result = findNext(src,0,0,arrivedNodes);
return result==Integer.MAX_VALUE?-1:result;
} public int findNext(int src, int value,int time,List<Integer> arrivedNodes) {
if(value>=this.minResult) {
return Integer.MAX_VALUE;
}
if(src == dst) {
this.minResult = this.minResult>value?value:this.minResult;
return value;
}
if(time>k) {
//超过了k条的限制
return Integer.MAX_VALUE;
}
List<int[]> Next = fromS(src,arrivedNodes);
if(Next == null) {
//如果最后结果为Integer.MAX_VALUE那么没有一条路走通
return Integer.MAX_VALUE;
} List<Integer> tempList = new ArrayList<Integer>(arrivedNodes);
tempList.add(src);
int result = Integer.MAX_VALUE;
for (int[] is : Next) {
int tempTime = time + 1;
int temp = findNext(is[1],value + is[2],tempTime,tempList);
if(temp < result) {
result = temp;
}
}
return result;
}
}

一开始纯BFS,到10个结点就超时了,然后加了不能往回走,17个超时,然后加了到了终点剪枝,100超时,没有再尝试下去了。

【力扣leetcode】-787. K站中转内最便宜的航班的更多相关文章

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

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

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

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

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

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

  4. [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 ...

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

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

  6. 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数

    最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...

  7. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  8. 力扣Leetcode 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  9. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

随机推荐

  1. 剑指offer 1-5

    二维数组中的查找 题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中 ...

  2. DRF之JWT认证

    一.JWT认证 JWT构成 JWT分为三段式:头.体.签名(head.payload.sgin) 头和体是可逆加密的,让服务器可以反解析出user对象,签名是不可逆加密,保证整个token的安全性的. ...

  3. fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化

    fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...

  4. 去抖动 debounce

    最近才发现 debounce 在 减少DOM操作及资源加载方面得重要性,遂写个博客记录一下 /** * @param {Function} func 要执行的函数 * @param {number} ...

  5. gpasswd简单记录

    gpasswd [option] GROUP 一切都是为了权限 gpasswd常用参数: -a, --add  USER 将user用户加入到组中 -d, --delete  USER 将user用户 ...

  6. asp.net c# 保存图片到sql2008

    //图像数据表:tx//字段id (nvarchar(50) ,image(image)//tgav为图片ID,实质为上传前的主名 (省略了.jpg)private void kkkkk(byte[] ...

  7. 使用python对工作簿每个sheet表进行数据可视化展示(本案例是从第2个sheet开始循环读取也就是索引为1的表)

    # 导入相关模块from pyecharts.charts import Barfrom pyecharts import options as optsfrom pyecharts.charts i ...

  8. Mysql数据量较大时分页查询优化

    据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是主键,vtype是int,vtype是索引. 最后co ...

  9. 如何写好技术文档——来自Google十多年的文档经验

    本文大部分内容翻译总结自<Software Engineering at Google> 第10章节 Documentation. 另外,该书电子版近日已经可以免费下载了 https:// ...

  10. mapGetters 的作用__为什么mapGetter前面有...(三个点是去掉{}的作用)

    参考:vuex 中关于 mapGetters 的作用 mapGetters 工具函数会将 store 中的 getter 映射到局部计算属性中.它的功能和 mapState 非常类似,我们来直接看它的 ...