当前位置: 首页 > news >正文

LeetCode Bellman-Ford 算法题解

LeetCode Bellman-Ford 算法题解

题目描述

Bellman-Ford 算法是一种用于解决单源最短路径问题的算法。与 Dijkstra 算法不同,Bellman-Ford 算法可以处理带有负权边的图,并且可以检测是否存在负权环。

示例

对于以下加权图:

A --(2)-- B --(4)-- C | | | (1) (-3) (1) | | | D --(5)-- E --(2)-- F

从 A 出发到各节点的最短路径长度为:

  • A → D: 1
  • A → B: 2
  • A → E: 2 + (-3) = -1
  • A → C: 2 + 4 = 6
  • A → F: 2 + (-3) + 2 = 1

解题思路

方法:Bellman-Ford 算法

思路

  • Bellman-Ford 算法的核心思想是通过松弛操作来逐步逼近最短路径。它通过最多 V-1 次松弛操作(其中 V 是顶点数)来确保找到从源节点到所有其他节点的最短路径。
  • 具体步骤:
    1. 初始化一个距离数组,源节点的距离为 0,其他节点的距离为无穷大。
    2. 对所有边进行 V-1 次松弛操作:对于每条边 (u, v),如果通过 u 到达 v 的距离比已知的距离小,则更新距离。
    3. 检查是否存在负权环:对所有边进行一次松弛操作,如果还能更新距离,则存在负权环。

复杂度分析

  • 时间复杂度:O(V * E),其中 V 是顶点数,E 是边数。需要进行 V-1 次松弛操作,每次操作遍历所有边。
  • 空间复杂度:O(V),需要存储距离数组。

代码实现

方法:Bellman-Ford 算法

# Bellman-Ford 算法 def bellman_ford(graph, start): # 获取所有节点 nodes = set() for u in graph: nodes.add(u) for v in graph[u]: nodes.add(v) nodes = list(nodes) V = len(nodes) # 初始化距离字典,源节点的距离为 0,其他节点的距离为无穷大 distances = {node: float('infinity') for node in nodes} distances[start] = 0 # 进行 V-1 次松弛操作 for _ in range(V - 1): updated = False # 遍历所有边 for u in graph: for v, weight in graph[u].items(): # 松弛操作:如果通过 u 到达 v 的距离比已知的距离小,则更新距离 if distances[u] + weight < distances[v]: distances[v] = distances[u] + weight updated = True # 如果没有更新,提前结束 if not updated: break # 检查是否存在负权环 has_negative_cycle = False for u in graph: for v, weight in graph[u].items(): if distances[u] + weight < distances[v]: has_negative_cycle = True break if has_negative_cycle: break return distances, has_negative_cycle # 测试 def test_bellman_ford(): # 构建图结构(邻接表) graph = { 'A': {'B': 2, 'D': 1}, 'B': {'A': 2, 'C': 4, 'E': -3}, 'C': {'B': 4, 'F': 1}, 'D': {'A': 1, 'E': 5}, 'E': {'B': -3, 'D': 5, 'F': 2}, 'F': {'C': 1, 'E': 2} } # 测试从 A 出发的最短路径 print("Shortest distances from A:") distances, has_negative_cycle = bellman_ford(graph, 'A') for node, distance in distances.items(): print(f"{node}: {distance}") print(f"Has negative cycle: {has_negative_cycle}") # 输出: # A: 0 # B: 2 # D: 1 # E: -1 # C: 6 # F: 1 # Has negative cycle: False if __name__ == "__main__": test_bellman_ford()

测试用例

测试用例:从 A 出发的最短路径

输入:

A --(2)-- B --(4)-- C | | | (1) (-3) (1) | | | D --(5)-- E --(2)-- F

输出:

Shortest distances from A: A: 0 B: 2 D: 1 E: -1 C: 6 F: 1 Has negative cycle: False

总结

Bellman-Ford 算法是一种重要的图论算法,它可以用于解决单源最短路径问题,并且可以处理带有负权边的图。通过松弛操作,Bellman-Ford 算法可以逐步逼近最短路径,并检测是否存在负权环。

Bellman-Ford 算法的核心思想是:通过最多 V-1 次松弛操作来确保找到从源节点到所有其他节点的最短路径,然后检查是否存在负权环。

掌握 Bellman-Ford 算法的原理和实现,对于理解和解决图论相关问题非常重要。

http://www.jsqmd.com/news/713549/

相关文章:

  • 从混乱网页到整洁笔记:MarkDownload让知识管理变得如此简单
  • 2026年,口碑爆棚的滁州居间金服,究竟哪个才值得你信赖? - GrowthUME
  • 揭秘!黄埔食堂肉菜配送背后的优质服务与新鲜秘诀 - GrowthUME
  • 2026年:如何快速降低论文AIGC率? - 降AI实验室
  • 邮件系统中的区块链技术应用:安全与合规性
  • 库卡机器人自动运行配置
  • 3步搞定Windows风扇噪音:FanControl免费工具完全指南
  • STM32新手避坑指南:当LED灯乱闪,先检查LCD是不是‘抢’了你的GPIO(以G431RBT6为例)
  • 沃尔玛购物卡回收渠道推荐 - 抖抖收
  • 2026年,专业莒县居间金服服务商将如何引领金融服务新风潮? - GrowthUME
  • 从高端化工到智慧化工:2026 温度传感器top10品牌实力榜与行业应用指南 - 仪表人小余
  • AI 营销公司怎么选?OmniSight AI 核心能力全拆解
  • Rufus深度解析:2026年最全U盘启动盘制作指南 - PC修复电脑医生
  • 轻量级系统监控工具Amon:部署、配置与生产实践指南
  • 新手必看!BUUCTF Misc杂项解题保姆级复盘(附常用工具链与避坑指南)
  • 探秘黄埔饭堂!新鲜食材配送背后藏着哪些不为人知的秘密? - GrowthUME
  • 2026 年近期温州编程竞赛机构深度测评:从新课标落地到信奥升学路径全解析 - GrowthUME
  • 2026 国内头部 GEO 厂商拆解:多维度剖析服务商核心竞争力与行业优势 - 速递信息
  • 去黑头哪款泥膜好用 这5款泥膜去黑头效果真的绝绝子 - 全网最美
  • 市场格局变迁!2026温度传感器厂家 TOP10 背后的行业趋势 - 仪表人小余
  • 白刚玉砂轮片推荐:从工厂到应用现场的一份「实战级」选型指南 - 企师傅推荐官
  • 保姆级教程:用Python的Scipy和Numpy搞定特征模态分解(FMD)信号处理
  • 2026年售后完善的液氧气裂技术服务商推荐,山东地区有哪些上榜? - 工业品网
  • 2026河南中小物业信息化建设白皮书——聚焦收费管控与客服服务升级 - movno1
  • 公众号动态排版是怎么做的?零基础制作动效动画工具推荐3款 公众号SVG效果教程 - 鹅鹅鹅ee
  • 2026年,这家上海居间金服高效服务商究竟有何过人之处? - GrowthUME
  • 主流图形化编程工具的在线编程界面链接及其对Arduino开发的支持情况汇总
  • 2026年全国沙漠徒步团建研学公司优选 覆盖多区域定制服务 聚焦专业服务与安全保障 - 深度智识库
  • PyCharm项目解释器选错了?从根源上杜绝ModuleNotFoundError的配置指南
  • 谁是行业标杆?CPU 聚氨酯阻燃防水卷材厂家综合实力排名解析 - 大风02