图论 之 弗洛伊德算法求解全源最短路径

文章目录

  • 题目

  • Floyd算法适合用于求解多源的最短路径的问题,相比之下,Dijkstra算法适合用于求解单源的最短路径的问题,并且,当边的权值只有1的时候,我们还能使用BFS求解最短路径的问题

图论 之 BFS
图论 之 迪斯科特拉算法求解最短路径

灵神讲解

  • Floyd算法可以从递归中得到,相对应的,我们也有使用记忆化搜索动态规划进行求解

递归方式的模版

python 复制代码
@cache
def dfs(k,i,j):
	if k < 0:
		# w[i][j]为i到j的权值
		return w[i][j]
	return min(dfs(k-1,i,j),dfs(k-1,i,k)+dfs(k-1,k,j))

动态规划的模版

python 复制代码
        # 首先构造图,无向图
        e = [[float('inf')]*n for _ in range(n)]
        for f,t,d in edges:
            e[f][t] = d 
            e[t][f] = d 

        # 三维数组,dp[k][i][j]表示从节点i到节点j并且中间结点<=k-1的最短距离(故意开多一个位置)
        dp = [[[0]*n for _ in range(n)] for _ in range(n+1)]
        # 初始化,dpp[0][i][j] = e[i][j]
        dp[0] = e[:]

        for k in range(n):
            for i in range(n):
                for j in range(n):
                    # 通过枚举找到最佳的情况
                    dp[k+1][i][j] = min(dp[k][i][j],dp[k][i][k]+dp[k][k][j])
# 最终的dp[n][i][j]就是所需的答案                 

题目

1334.阈值距离内邻居最少的城市

1334.阈值距离内邻居最少的城市

思路分析:我们直接使用Floyd算法进行求解即可

  • 递归求解
python 复制代码
class Solution:
    def findTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int:
        # 弗洛伊德算法其实就是递归就可以解决
        # 首先构造图,无向图
        e = [[float('inf')]*n for _ in range(n)]
        for f,t,d in edges:
            e[f][t] = d 
            e[t][f] = d 
        
        # 定义求解的弗洛伊德算法
        @cache
        def dfs(k,i,j):
            if k < 0:
                return e[i][j]
            return min(dfs(k-1,i,j),dfs(k-1,i,k)+dfs(k-1,k,j))
        ans = 0
        cur = float('inf')
        # 开始调用
        for i in range(n):
            count = 0
            for j in range(n):
                if i != j and dfs(n-1,i,j) <= distanceThreshold:
                    count+=1
            # 更新
            if count <= cur:
                cur = count
                ans = i 
        return ans
  • 动态规划,动态规划的效率高一点
python 复制代码
class Solution:
    def findTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int:
        # 弗洛伊德算法其实就是递归就可以解决
        # 首先构造图,无向图
        e = [[float('inf')]*n for _ in range(n)]
        for f,t,d in edges:
            e[f][t] = d 
            e[t][f] = d 

        # 三维数组,dp[k][i][j]表示从节点i到节点j并且中间结点<=k-1的最短距离(故意开多一个位置)
        dp = [[[0]*n for _ in range(n)] for _ in range(n+1)]
        # 初始化,dpp[0][i][j] = e[i][j]
        dp[0] = e[:]

        for k in range(n):
            for i in range(n):
                for j in range(n):
                    # 通过枚举找到最佳的情况
                    dp[k+1][i][j] = min(dp[k][i][j],dp[k][i][k]+dp[k][k][j])
        
        ans = 0
        cur = float('inf')
        # 开始调用
        for i in range(n):
            count = 0
            for j in range(n):
                if i != j and dp[n][i][j] <= distanceThreshold:
                    count+=1
            # 更新
            if count <= cur:
                cur = count
                ans = i 
        return ans
相关推荐
find1star7 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing7 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21127 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP9 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN9 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218319 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤10 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate10 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran10 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹11 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统