《经典图论算法》贝尔曼-福特算法(Bellman-Ford)

摘要:

1,Bellman-Ford 算法的介绍

2,Bellman-Ford 算法为什么可以解决有负权边的图

3,Bellman-Ford 算法为什么不能解决有负权回路的图

4,Bellman-Ford 算法的代码实现和负权回路的判断

5,Bellman-Ford 算法的代码优化

1,Bellman-Ford算法的介绍

贝尔曼-福特算法(Bellman-Ford algorithm)和迪杰斯特拉算法(Dijkstra)一样也是求单源点最短路径的,但Dijkstra算法不能解决有负权边的图,如果想要解决有负权边的图可以使用 Bellman-Ford 算法。

解题思路就是假设有一条边 [begin,end,value] ,如果 dis[begin] + value < dis[end] ,我们可以更新 dis[end] 的值为 dis[begin] + value ,如下图所示,0 到 2 的距离如果经过顶点 1 会更小。

所以我们只需要枚举所有的边即可,代码如下:

go 复制代码
for (int[] edge : edges) {// 遍历边。
    int begin = edge[0];// 边的起点。
    int end = edge[1];// 边的终点。
    int value = edge[2];// 边的权值。
    if (dis[begin] + value < dis[end])// 松弛。
        dis[end] = dis[begin] + value;
}

如果只枚举一遍的话,有可能只会更新和起始点邻接的点(也就是起始点直接指向的点),与起始点没有邻接的点可能没更新,也可能更新了,这个和边的更新顺序有关,如下图所示。

也就是说如果枚举一遍,至少可以更新从起始点通过一条边到达的点,枚举两遍至少可以更新从起始点通过两条边到达的点 ...... 。在一个含有 n 个顶点的图中,一个点最多只能有 n-1 条边和起始点相连。所以我们最多只需要枚举 n-1 次即可计算从起始点到其他所有点的距离。

相关推荐
沪漂阿龙8 小时前
大模型采样策略终极指南:Top-k、Top-p与结构化输出最佳实践
人工智能·算法·机器学习
DeepModel8 小时前
【回归算法】局部加权回归(LWR)详解
人工智能·算法·回归
浅念-8 小时前
C++ STL list 容器
开发语言·数据结构·c++·经验分享·笔记·算法·list
重生之后端学习8 小时前
39. 组合总和
java·数据结构·算法·职场和发展·深度优先
Frostnova丶8 小时前
LeetCode 868. 二进制间距
算法·leetcode
nix.gnehc8 小时前
深入理解Go并发核心:GMP模型与Goroutine底层原理
开发语言·算法·golang
心本无晴.8 小时前
RAG中的混合检索(Hybrid Search):稀疏检索与稠密检索的强强联合
人工智能·python·算法
你的论文学长8 小时前
对抗知网的 N-Gram 算法:基于语义解耦的【文本重构】与【事实性核验】架构设计
人工智能·算法·重构
WW_千谷山4_sch8 小时前
MYOJ_7788:(洛谷P3387)【模板】缩点(有关强连通分量)
c++·算法·深度优先·动态规划·图论·拓扑学
小O的算法实验室8 小时前
2026年IEEE TCYB SCI1区TOP,少即是多:一种用于大规模优化的小规模学习粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进