Floyd-Warshall 解题模板,助你快速AC

算法吟游者
• 阅读 2976

Floyd-Warshall 是解决任意两点间的最短路径的一种算法,LeetCode 有很多题目都用了,掌握这套解题模板帮你快速 AC。

题目地址(1334. 阈值距离内邻居最少的城市)

https://leetcode-cn.com/probl...

题目描述

有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。

返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为 distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。

注意,连接城市 i 和 j 的路径的距离等于沿该路径的所有边的权重之和。

 

示例 1:

Floyd-Warshall 解题模板,助你快速AC




输入:n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4
输出:3
解释:城市分布图如上。
每个城市阈值距离 distanceThreshold = 4 内的邻居城市分别是:
城市 0 -> [城市 1, 城市 2] 
城市 1 -> [城市 0, 城市 2, 城市 3] 
城市 2 -> [城市 0, 城市 1, 城市 3] 
城市 3 -> [城市 1, 城市 2] 
城市 0 和 3 在阈值距离 4 以内都有 2 个邻居城市,但是我们必须返回城市 3,因为它的编号最大。
示例 2:

Floyd-Warshall 解题模板,助你快速AC


输入:n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distanceThreshold = 2
输出:0
解释:城市分布图如上。 
每个城市阈值距离 distanceThreshold = 2 内的邻居城市分别是:
城市 0 -> [城市 1] 
城市 1 -> [城市 0, 城市 4] 
城市 2 -> [城市 3, 城市 4] 
城市 3 -> [城市 2, 城市 4]
城市 4 -> [城市 1, 城市 2, 城市 3] 
城市 0 在阈值距离 4 以内只有 1 个邻居城市。
 

提示:

2 <= n <= 100
1 <= edges.length <= n * (n - 1) / 2
edges[i].length == 3
0 <= fromi < toi < n
1 <= weighti, distanceThreshold <= 10^4
所有 (fromi, toi) 都是不同的。

思路

这道题的本质就是:

  1. 在一个无向图中寻找每两个城镇的最小距离,我们使用 Floyd-Warshall 算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法,是解决任意两点间的最短路径的一种算法。
  2. 筛选最小距离不大于  distanceThreshold 的城镇。
  3. 统计每个城镇,其满足条件的城镇有多少个
  4. 我们找出最少的即可

Floyd-Warshall 算法的时间复杂度和空间复杂度都是$O(N^3)$, 而空间复杂度可以优化到$O(N^2)$。Floyd-Warshall 的基本思想是对于每两个点之间的最小距离,要么经过中间节点 k,要么不经过,我们取两者的最小值,这是一种动态规划思想,详细的解法可以参考Floyd-Warshall 算法(wikipedia)

代码

代码支持:Python3

Python3 Code:

class Solution:
    def findTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int:
        # 构建dist矩阵
        dist = [[float('inf')] * n for _ in  range(n)]
        for i, j, w in edges:
            dist[i][j] = w
            dist[j][i] = w
        for i in range(n):
            dist[i][i] = 0
        for k in range(n):
            for i in range(n):
                for j in range(n):
                    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

        # 过滤
        res = 0
        minCnt = float('inf')
        for i in range(n):
            cnt = 0
            for d in dist[i]:
                if d <= distanceThreshold:
                    cnt += 1
            if cnt <= minCnt:
                minCnt = cnt
                res = i
        return res

关键点解析

  • Floyd-Warshall 算法
  • 你可以将本文给的 Floyd-Warshall 算法当成一种解题模板使用
点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Wesley13 Wesley13
3年前
ACM金牌大神侯卫东老师的四步动规解题秘籍!请收下
近年来,国内外科技公司的算法面试中,动态规划几乎成了必考题型。动规题目类型众多,又没有固定的解题模板,初学者往往摸不着头脑,有时还会混淆动规和递归,所以动态规划又被称为“新人杀手”。不过动态规划的难,更多是因为初学者不知道怎么入门。学会正确的思考模式和解题流程,掌握动态规划其实并不难。九章侯卫东老师针对所有动态规划题型,总结了一套
贾蔷 贾蔷
1个月前
NOIP 2000 提高组 洛谷1004题(方格取数)解题思路与C++代码解析
一、题目描述简要描述题目:例如,在一个n×n的方格图中,每个格子包含一个正整数。需要选择两条从左上角到右下角的路径,路径可重复经过格子,但两条路径除起点和终点外不能相交。求两条路径数字和的最大值。二、解题思路与算法分析1.问题分析1.问题核心是求解两条不交
贾蔷 贾蔷
1个月前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算
贾蔷 贾蔷
1个月前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
1个月前
2023年GESP六级题解:洛谷P10108闯关游戏动态规划解法详解
一、题目解读本文针对2023年GESP六级题目“闯关游戏”(洛谷P10108)进行详细解析。题目要求玩家通过不同关卡路径选择,计算从起点到终点的最大得分。关卡间存在跳跃规则,需结合动态规划思想设计高效算法,最终输出最优得分。二、解题思路采用动态规划(Dyn
深度学习 深度学习
3星期前
动态规划巧解字符串压缩优化问题 - 力扣1531题深度解析
一、问题理解行程长度编码(RunLengthEncoding)是一种简单有效的压缩方法。题目要求我们在删除最多k个字符后,使压缩后的字符串长度最短。二、解题思路1.状态定义:dp:情况1:删除当前字符,直接继承dp1.练习简单DP问题1.逐步过渡到这类复杂
贾蔷 贾蔷
2星期前
洛谷P3365 改造二叉树:从问题分析到代码实现
一、问题分析题目要求我们计算将修改为(BST)所需的最少修改次数。二叉搜索树的性质是:对于任意节点,其左子树所有节点的值都小于该节点的值,右子树所有节点的值都大于该节点的值。二、解题思路1.‌序列‌:BST的中序遍历结果是一个严格1.‌问题转化‌:将原二叉
贾蔷 贾蔷
2星期前
2024蓝桥杯省赛B组“传送阵”题解
一、题目解读2024年省B组“传送阵”题目要求处理一个包含n个节点的,节点间存在单向传输关系。每个节点i可传送至a中的最长路径问题,需考虑环的存在及节点间的连通性。二、解题思路1.预处理阶段使用标记法找出所有环,记录每个环的大小(即节点数)。2.统计最大环
深度学习 深度学习
2星期前
动态规划巧解字符串压缩优化问题 - 力扣1531题深度解析
一、问题理解行程长度编码(RunLengthEncoding)是一种简单有效的压缩方法。题目要求我们在删除最多k个字符后,使压缩后的字符串长度最短。二、解题思路1.状态定义:dp:情况1:删除当前字符,直接继承dp1.练习简单DP问题1.逐步过渡到这类复杂
贾蔷 贾蔷
2星期前
牛客13278题详解:句子单词反转(C++实现)
一、题目解读13278题要求编写函数实现句子中单词顺序的反转,例如将"HelloWorld"转换为"WorldHello"。需注意处理首尾空格、单词间空格数量保持原样,仅单词顺序颠倒。题目考察对操作的掌握,特别是分割与重组技巧。二、解题思路采用:1.预处理