💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
贝尔曼-福特算法(Bellman-Ford algorithm)是一种用于在带有权重的有向图中找到单源最短路径的算法。它可以处理负权重边,因此在某些情况下比狄克斯特拉算法更有用。下面是贝尔曼-福特算法的基本步骤:
-
初始化距离:将源节点到所有其他节点的距离初始化为无穷大(除了源节点本身的距离为 0)。同时,创建一个数组或列表来保存每个节点的最短距离估计。
-
重复以下步骤(节点数量 - 1)次:
a. 对于图中的每一条边(u,v)(u 是起始节点,v 是目标节点),如果从源节点到 v 的距离通过 u 更短,更新距离。更新的方式是:如果源节点到 u 的距离加上从 u 到 v 的距离小于源节点到 v 的当前距离,则将源节点到 v 的距离更新为源节点到 u 的距离加上从 u 到 v 的距离。 -
检查是否存在负权重环路:如果在第 2 步中的重复迭代中,最短路径估计仍然在改进(即存在负权重环路),则说明图中存在负权重环路,无法找到最短路径。算法会返回一个错误或报告有负权重环路。
-
最终得到最短路径:如果没有负权重环路,那么在第 2 步完成后,最短路径估计数组中的值就是从源节点到每个节点的最短距离。
public class DP_02_BellmanFord_02 {static class Edge {int from;int to;int weight;public Edge(int from, int to, int weight) {this.from = from;this.to = to;this.weight = weight;}}/*f(v) 用来表示从起点出发,到达 v 这个顶点的最短距离初始时f(v) = 0 当 v==起点 时f(v) = ∞ 当 v!=起点 时之后新 旧 所有fromf(to) = min(f(to), f(from) + from.weight)from 从哪来to 到哪去f(v4) = min( ∞, f(v3) + 11 ) = 20f(v4) = min( 20, f(v2) + 15 ) = 20v1 v2 v3 v4 v5 v60 ∞ ∞ ∞ ∞ ∞0 7 9 ∞ ∞ 14 第一轮0 7 9 20 23 11 第二轮0 7 9 20 20 11 第三轮0 7 9 20 20 11 第四轮0 7 9 20 20 11 第五轮*/public static void main(String[] args) {List<Edge> edges = Arrays.asList(new Edge(6, 5, 9),new Edge(4, 5, 6),new Edge(1, 6, 14),new Edge(3, 6, 2),new Edge(3, 4, 11),new Edge(2, 4, 15),new Edge(1, 3, 9),new Edge(1, 2, 7));//长度为节点数+1int[] dp = new int[7];dp[1] = 0;for (int i = 2; i < dp.length; i++) {dp[i] = Integer.MAX_VALUE;}print(dp);for (int i = 0; i < 5; i++) {for (Edge edge : edges) {if (dp[edge.from] != Integer.MAX_VALUE) {dp[edge.to] = Integer.min(dp[edge.to], dp[edge.from] + edge.weight);}}}print(dp);}static void print(int[] dp) {System.out.println(Arrays.stream(dp).mapToObj(i -> i == Integer.MAX_VALUE ? "∞" : String.valueOf(i)).collect(Collectors.joining(",", "[", "]")));}
}
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙