数据结构与算法之动态规划: LeetCode 787. K 站中转内最便宜的航班 (Ts, Py, Go版)

787. K 站中转内最便宜的航班(加权有向图的最短路径) 题目: 思路: 加权图的最短路径 1. 首先将航线转化为字典形式存储。(当前城市–下一城市–费用) 2. 建一个双向队列,元素为元组形式。(当前城市,src到当前城市的费用,中转次数) 3. 记录src到目的地dst的最小费用cheapest=1e6。(先设置为一个很大的数,这样在最后若cheapest=1e6,则说明没有从src到dst的路径,此时,返回-1) 4. 然后处理队列: 4... 阅读详情

K 站中转内最便宜的航班

描述

  • 有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 f l i g h t s [ i ] = [ f r o m i , t o i , p r i c e i ] flights[i] = [from_i, to_i, price_i] flights[i]=[fromi​,toi​,pricei​] ,表示该航班都从城市 f r o m i from_i fromi​ 开始,以价格 p r i c e i price_i pricei​ 抵达 t o i to_i toi​。

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

示例 1

输入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
输出: 200
解释: 从城市 0 到城市 2 在 1 站中转以内的最便宜价格是 200

示例 2

输入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 0
输出: 500
解释: 从城市 0 到城市 2 在 0 站中转以内的最便宜价格是 500

提示:

  • 1 <= n <= 100
  • 0 <= flights.length <= (n * (n - 1) / 2)
  • flights[i].length == 3
  • 0 <= f r o m i from_i fromi​, t o i to_i toi​ < n
  • f r o m i ! = t o i from_i != to_i fromi​!=toi​
  • 1 <= p r i c e i price_i pricei​ <= 1 0 4 10^4 104
  • 航班没有重复,且不存在自环
  • 0 <= src, dst, k < n
  • src != dst

Typescript 版算法实现

1 )方案 1

function findCheapestPrice(n: number, flights: number[][], src: number, dst: number, k: number): number {
  const cheap = (flights: number[][], src: number, dst: number, k: number) => {
    // 找到终点站的前一站
    const prev: number[][] = flights.filter(item => item[1] === dst)
    // 求最小值
    const min: number = Math.min.apply(null, prev.map(item => {
      // 如果第一项就是起点,直接返回价格
      if (item[0] === src && k > -1) {
        return item[2]
      }
      // 这是一个 trick,用int的最大值来替换当前最小值,实际上没有其他数字比这个大,bigInt类型的除外
      if (k === 0 && item[0] !== src) {
        return Number.MAX_SAFE_INTEGER
      }
      // 核心公式
      return item[2] + cheap(flights, src, item[0], k - 1)
    }))
    return min
  }
  // 增加返回值是不是Number.MAX_SAFE_INTEGER,如果是返回-1
  const min = cheap(flights, src, dst, k)
  return min >= Number.MAX_SAFE_INTEGER ? -1 : min
};
  • 上述方案,比官方少了一个参数 n, 但是仍能运行
  • 这里核心的分解公式是:F(src,dst,k) = Min(F(src,dst-1, k-1) + F(dst-1, dst, 1))
  • 也就是 到 dst目的地,分解成到 src到dst-1和从dist-1到dist的两个过程
  • 上述求解过程多了一个边界的判断,用了一个 Number.MAX_SAFE_INTEGER 的小技巧
  • 这个算法并没有用到官方给定的参数 n, 也就是 n 个城市
  • 这个分解是没有问题的,但是实现方案是有问题的
  • 最大的问题是,这种算法是通过递归来实现的,并不是动态规划,容易爆栈,而且会很慢
  • 这是一个反面的教材

2 )方案 2

function findCheapestPrice(n: number, flights: number[][], src: number, dst: number, k: number): number {
    const dist: number[] = new Array<number>(n).fill(Infinity); // 计算一维数组
    dist[src] = 0; // 开始城市记0
    // 最多经过k站中转 => 最多经过k+1条边
    for(let p:number = 0; p<k+1; p++) {
        const prev = Array.from(dist);
        // 直接利用flights作为存图信息 
        // a是from b是to c是price
        for(const [a, b, c] of flights) dist[b] = Math.min(dist[b], prev[a] + c);
    }
    return dist[dst] == Infinity ? -1 : dist[dst];
};
  • 这个是官方示例算法
  • 这个算法一开始准备一个容量为n的一维数组
  • 这个题目设计的精妙在于,起点 src 从0开始 ,终点dst就是最后一个下标
  • 这个和我们数组的下标开始正好对应上,所以使用一维数组来存放计算结果
  • 我们画图可知,经过k站中转,必定要经过 k+1 条边,这样我们只需要计算 k+1次
  • 计算的核心是,求解到达站最小的花费,也就是当前到达站的花费与前一站花多少钱到达这一站,求解出到达当前站的最小花费
  • 最终到达每一站都会有一个花费的值,如果仍是占位的 Infinity 说明当前站不可达
  • 这就是整个算法的精妙之处

3 )方案 3

function findCheapestPrice(n: number, flights: number[][], src: number, dst: number, k: number): number {
    const w = new Array<number[]>(n).fill(null).map(() => new Array<number>(n)); // 初始二维矩阵
    const dist = new Array<number>(n);
    function BellmanFord(): number {
        dist.fill(Infinity);
        dist[src] = 0;
        // 最多经过k站中转 => 最多经过k+1条边
        for(let p: number = 0; p < k + 1; p ++) {
            const prev = Array.from(dist);
            for(let i:number = 0; i < n; i ++) {
                for(let j:number = 0; j<n; j ++) {
                    dist[j] = Math.min(dist[j], prev[i] + w[i][j]);
                }
            }
        }
        return dist[dst];
    }
    for(let i: number = 0; i < n; i ++) {
        for(let j: number = 0; j < n; j ++) {
            w[i][j] = i == j ? 0 : Infinity;
        }
    }
    for(const [a, b, c] of flights) w[a][b] = c;
    let res = BellmanFord();
    return res == Infinity ? -1 : res;
};
  • 这个也是官方示例算法, 用了临接矩阵的方式,依赖数学基础
  • 整体来说不如 方案2
  • 方案2, 3都是在官方给定的示例基础上优化而来的

Python3 版算法实现

1 )方案 1

class Solution:
    def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:
        def cheap(flights: list[list[int]], src: int, dst: int, k: int) -> int:
            # 找到终点站的前一站
            prev = [flight for flight in flights if flight[1] == dst]

            # 求最小值
            min_cost = float('inf')
            for item in prev:
                # 如果第一项就是起点,直接返回价格
                if item[0] == src and k >= 0:
                    min_cost = min(min_cost, item[2])
                    continue

                # 如果已无中转次数,且当前节点不是起点,则跳过
                if k == 0 and item[0] != src:
                    continue

                # 核心公式
                min_cost = min(min_cost, item[2] + cheap(flights, src, item[0], k - 1))

            return min_cost

        # 增加返回值判断,如果是 float('inf'),则返回 -1
        min_cost = cheap(flights, src, dst, k)
        return -1 if min_cost == float('inf') else min_cost
  • 超出时间限制

2 )方案 2

class Solution:
    def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:
        dist = [float('inf')] * n  # 初始化距离数组为无穷大  
        dist[src] = 0  # 源城市到自身的距离为0  
    
        # 最多经过k站中转 => 最多经过k+1条边  
        for p in range(k + 1):  
            prev = dist.copy()  # 复制当前距离数组  
    
            # 遍历航班信息更新距离  
            for flight in flights:  
                a, b, c = flight  # a是from, b是to, c是price  
                dist[b] = min(dist[b], prev[a] + c)  
    
        return -1 if dist[dst] == float('inf') else dist[dst] 

3 )方案 3

class Solution:
    def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:
        def bellman_ford():
            dist = [float('inf')] * n
            dist[src] = 0
            # 最多经过k站中转 => 最多经过k+1条边
            for _ in range(k + 1):
                prev = list(dist)
                for i in range(n):
                    for j in range(n):
                        dist[j] = min(dist[j], prev[i] + w[i][j])

            return dist[dst]

        w = [[float('inf')] * n for _ in range(n)]
        for i in range(n):
            for j in range(n):
                w[i][j] = 0 if i == j else float('inf')

        for a, b, c in flights:
            w[a][b] = c

        res = bellman_ford()
        return -1 if res == float('inf') else res

Golang 版算法实现

1 )方案 1

func findCheapestPrice(n int, flights [][]int, src int, dst int, k int) int {
	var cheap func(flights [][]int, src int, dst int, k int) int
	cheap = func(flights [][]int, src int, dst int, k int) int {
		// 找到终点站的前一站
		prev := make([][]int, 0)
		for _, item := range flights {
			if item[1] == dst {
				prev = append(prev, item)
			}
		}

		// 求最小值
		min := math.MaxInt32
		for _, item := range prev {
			// 如果第一项就是起点,直接返回价格
			if item[0] == src && k > -1 {
				min = int(math.Min(float64(min), float64(item[2])))
				continue
			}

			// 如果已无中转次数,且当前节点不是起点,则跳过
			if k == 0 && item[0] != src {
				continue
			}

			// 核心公式
			min = int(math.Min(float64(min), float64(item[2]+cheap(flights, src, item[0], k-1))))
		}

		return min
	}

	// 增加返回值判断,如果是 math.MaxInt32,则返回 -1
	min := cheap(flights, src, dst, k)
	if min == math.MaxInt32 {
		return -1
	}
	return min
}
  • 超出时间限制

2 )方案 2

func findCheapestPrice(n int, flights [][]int, src int, dst int, k int) int {  
	dist := make([]int, n)  
	for i := range dist {  
		dist[i] = math.MaxInt32 // 初始化距离为最大整数  
	}  
	dist[src] = 0 // 开始城市距离为0  
  
	// 最多经过k站中转 => 最多经过k+1条边  
	for p := 0; p <= k; p++ {  
		prev := make([]int, len(dist))  
		copy(prev, dist) // 复制当前距离数组到prev  
  
		// 遍历航班信息  
		for _, flight := range flights {  
			a, b, c := flight[0], flight[1], flight[2]  
			// 更新到达b城市的最小距离  
			dist[b] = min(dist[b], prev[a]+c)  
		}  
	}  
  
	if dist[dst] == math.MaxInt32 {  
		return -1 // 如果到达dst城市的距离仍然是最大整数,则返回-1  
	}  
	return dist[dst]  
}  
  
func min(a, b int) int {  
	if a < b {  
		return a  
	}  
	return b  
} 

3 )方案 3

func findCheapestPrice(n int, flights [][]int, src int, dst int, k int) int {
	// 初始化二维矩阵 w,用于存储任意两点之间的最小费用  
	w := make([][]int, n)  
	for i := 0; i < n; i++ {  
		w[i] = make([]int, n)  
		for j := 0; j < n; j++ {  
			if i == j {  
				w[i][j] = 0  
			} else {  
				w[i][j] = math.MaxInt32  
			}  
		}  
	}  
  
	// 根据航班信息更新 w 矩阵中对应边的权重  
	for _, flight := range flights {  
		a, b, c := flight[0], flight[1], flight[2]  
		w[a][b] = c  
	}  
  
	// 初始化距离数组 dist,用于存储从起点到各点的最小费用  
	dist := make([]int, n)  
	for i := range dist {  
		dist[i] = math.MaxInt32  
	}  
	dist[src] = 0  
  
	// Bellman-Ford 算法实现  
	BellmanFord := func() int {  
		for p := 0; p <= k; p++ {  
			prev := make([]int, n)  
			copy(prev, dist)  
			for i := 0; i < n; i++ {  
				for j := 0; j < n; j++ {  
					if w[i][j] != math.MaxInt32 {  
						dist[j] = min(dist[j], prev[i]+w[i][j])  
					}  
				}  
			}  
		}  
		return dist[dst]  
	}  
  
	res := BellmanFord()  
	if res == math.MaxInt32 {  
		return -1  
	}  
	return res  
}  
  
// 辅助函数,返回两个整数中的较小值  
func min(a, b int) int {  
	if a < b {  
		return a  
	}  
	return b  
}
【数据结构与算法】之深入解析“K站中转内最便宜的航班”的求解思路与算法示例 一、题目要求 有 n 个城市通过一些航班连接,给你一个数组 flights,其中 flights[i] = [fromi, toi, pricei],表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜,并返回该价格。 如果不存在这样的路线,则输出 -1。 示例 1:从城市 0 到城市 2 在 1 站中转以内的最便宜价格是 20 阅读详情

相关推荐

保姆级教程:手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动

本文提供了一份详细的保姆级教程,手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动。从基础配置到RGMII接口的特殊设置,再到驱动开发的关键步骤和调试技巧,帮助开发者快速掌握PHY芯片的移植与开发。

weixin_33734785的博客 335

来自北大算法课的Leetcode题解:787. K站中转内最便宜的航班

递归终止条件为:轮次用完了 or 走到目标了 or memo在这个起点和轮次恰好能走到最终目标,如果没终止则依次遍历航班信息bfs搜索当前价格并刷新最小价格,最后将最小价格存下来并返回。解法1(超时):图的广搜。外层通过queue广搜,弹出一个节点遍历图中所有起始点为此弹出node的边,如果这条边的dst就是终点则添加到可能结果中(实现时只保存最小的价格就好),如果不是终点就把dst作为新的src入队,并让其搜索层次+1,如果发现某次出对已经是k次中转之外的就可以提前返回了。

double_ZZZ的博客 221

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 543

leetcode每日一题系列——787. K 站中转内最便宜的航班

787. K 站中转内最便宜的航班 难度中等346收藏分享切换为英文接收动态反馈 有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k个 中转的站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出

勿在浮沙築高台 477

解决用VScode写中文注释,Vivado打开之后是乱码的方法

这样就解决了中文注释乱码的问题,此外如果使用notepad++写verilog代码的话直接在notepad++上面将编码格式改为ANSI格式即可,更加方便快捷,所以此方法仅针对习惯用VScode写Verilog的同学,如果有其他好办法的话欢迎评论区补充。首先,VScode中的中文默认编码格式是UTF-8,然后Vivado的编码格式是vivado 默认的应该是ANSI编码格式,刚开始我先按照网上说明的,将VScode中的编码格式改为GBK格式(点击右下角->点击通过编码保存)。

weixin_50573305的博客 5816

VMware player桥接模式不能联网的解决方法

VMware虚拟机下主要使用两种网络连接方式:桥接模式、NAT模式。 桥接模式:查一下,虚拟机独立IP。 NAT模式:与电脑共享IP、需要映射应用服务的端口。 我的需求需要独立IP,于是使用桥接。 网络连接失败。 个人主机系统的网络设置: 设置 - 网络和 Internet - 更改适配器设置 给虚拟机设置网络适配器 只保留,点击确定,确定。 重新运行虚拟机。 ...

Mark_md的博客 9450

Leetcode--K 站中转内最便宜的航班

K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。 示例 1: 输入: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500...

IT荻的博客 1749

HFSS实战(三)——过孔via TDR仿真

在上一讲中,主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看到一个整体的结果,并不知道via真实的阻抗是多少?想要单独确定via的阻抗,最好还是通过TDR的仿真。

luohuo9844的博客 1万+

LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)

文章目录贝尔曼-福特算法(Bellman-Ford)简介算法思想算法执行过程应用题目描述分析代码LeetCode 787. K 站中转内最便宜的航班题目描述Bellman Ford + 邻接矩阵Reference 贝尔曼-福特算法(Bellman-Ford) 简介 贝尔曼-福特算法(Bellman-Ford)是由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的,求解含负权边的带权有向图的单源最短路径问题的一种算法。它的原理是对图进行V−1V-1V−1次松弛操作(VVV代表图中的点

xylitolz的博客 1610

逆向分析PerimeterX px3:从混淆JS到生成有效令牌的完整实战

在Web安全与数据采集领域,反自动化防护是保障服务稳定和数据安全的关键技术。其核心原理是通过收集浏览器环境指纹和用户行为特征,动态生成加密令牌来区分真人用户与自动化脚本。这项技术的工程价值在于平衡安全性与用户体验,广泛应用于电商、金融、社交等需要防止恶意爬虫和自动化攻击的场景。本文聚焦于业界广泛部署的PerimeterX px3防护方案,通过JavaScript逆向工程,深入剖析其令牌生成机制。我们将探讨如何运用动态调试、反混淆工具和算法还原等关键技术,突破px3的防护壁垒,为自动化测试和数据采集提供稳定可

diankui6178的博客 538

R语言 地理加权随机森林(GWRFC )

随机森林可以产生高准确度的分类器,被广泛用于解决模式识别问题。然而,随机森林赋予每个决策树相同的权重,这在一定程度上降低了整个分类器的性能。该算法引入二次训练过程,提高分类正确率高目前,鲜有中文文章介绍GWRFC的技术文档,作者想使用该方法时会遇到重重困难,因此有必要利用R来建模,通过流程演示,供读者参阅。............

qingchen98的博客 6636

K 站中转内最便宜的航班

这一题是带有限制的带权最短路径题目。 方法一:改进的BFS,使用优先级队列(超时) 一般遇到最短路径(最少步骤、最近距离)的题目,要下意识地想到用BFS。 这一题是带权的,直接bfs不好写,可以借助于优先级队列,这一题中需要用到小根堆,每次选择距离src最近的进行处理 class Node{ public: int N; //号 int K; //与src之间有多少个中转节点 int D; //与src之间的距离 Node(int n,int k,int d):N(n)

丰旭的博客 244

24、交通信号协调算法与模型解析

本文深入解析了交通信号协调中的关键算法与模型,包括多路径进展模型、MAXBAND网络系统模型和松弛启用带模型。这些模型通过合理安排相位序列、优化绿波带宽等方式,提高了交通运行的效率。文章还探讨了交通控制从单点控制向网络协调的发展趋势,分析了当前面临的挑战与机遇,并提出了未来研究方向,如借助信息技术和机器学习,深入研究交通网络的基本构成,以实现智能化和精准化的信号协调。

agile9scrum的博客 134

43、K 站中转内最便宜的航班(即求最短路径)

一、问题 有 n 个城市通过一些航班连接。给你一个数组flights ,其中flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格pricei 抵达 toi 。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 二、思路 方法一:迪杰斯特拉算法 与 Dijk...

sunnnnh的博客 1391

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

leetcode:787. K 站中转内最便宜的航班【k步最短路 + dfs记忆化 + defaultdict(dict)】

分析 用一个defaultdict记录每一个点能飞到的地方和距离 自顶向下的dfs + cache 记忆化参数是当前的位置以及剩余的次数,结果是到达终点的距离 如果能到达终点,返回0 如果次数用尽,返回inf 次数-1,且当前res设置为inf 遍历所有能飞的下一个位置,然后res取res和dfs(nxt, remain) + connect[now][nxt]的最小值这种思想就是把问题推到下一步,直到尽头(到达终点,次数用尽)dfs解决k步最短路问题,优雅...

小楼一夜听春雨 420

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

787. K 站中转内最便宜的航班 | 514.自由之路

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。如果不存在这样的路线,则输出 -1。示例 1:输入:输出: 200解释:城市航班图如下。

weixin_50437588的博客 433

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

K 站中转内最便宜的航班 有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 toi 抵达 pricei。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 示例 1: 输入: n = 3, edges = .

Tzecto 533

保姆级教程:手把手教你用Node.js和asar搞定StarUML 5.0.2无水印导出(附npm证书过期解决方案)

本文提供了一份详细的Node.js和asar工具使用教程,帮助用户实现StarUML 5.0.2的无水印导出。通过环境配置、资源提取、核心逻辑修改和重打包等步骤,解决证书过期问题并掌握Electron应用定制技术,适用于开发者和技术爱好者进行软件深度定制。

weixin_30835649的博客 501

21-8-24 K 站中转内最便宜的航班

787. K 站中转内最便宜的航班 难度[中等] 有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -

Harswlgb的博客 150

K 站中转内最便宜的航班(bfs最短路)

787. K 站中转内最便宜的航班 有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 思路 不能直接用dijistra或者spfa用

weixin_46271002的博客 268

力扣787. K 站中转内最便宜的航班

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 787. K 站中转内最便宜的航班 难度中等430 有 n 个城市通过一些航班连接

qq_43431863的博客 536

Cheapest Flights Within K Stops K 站中转内最便宜的航班

有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。示例 1: 输入: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]] src = 0, ds...

qq_26410101的博客 1244

leetcode787.K站中转内最便宜的航班

题目大意 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。 示例 1: 输入: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]] src = 0, dst = 2, k = 1 输出: 200 解释: 城市航班图如下 从城市 0 到城市 2 在

大腿壮的博客 505

动态规划-787-K站内最便宜的飞行路线

Description: There are n cities connected by m flights. Each fight starts from city u and arrives at v with a price w. Now given all the cities and fights, together with starting city src and the de...

fighting! 1391

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374
上一篇: 数据结构与算法之动态规划: LeetCode 63. 不同路径 II (Ts, Py, Go版)
下一篇: 数据结构与算法之栈: LeetCode 682. 棒球比赛 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值