文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java Bellman-Ford算法原理及实现方法

2023-07-02 16:39

关注

本篇内容介绍了“Java Bellman-Ford算法原理及实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一 点睛

如果遇到负权边,则在没有负环(回路的权值之和为负)存在时,可以采用 Bellman-Ford 算法求解最短路径。该算法的优点是变的权值可以是负数、实现简单,缺点是时间复杂度过高。但是该算法可以进行若干种优化,以提高效率。

Bellman-Ford 算法与 Dijkstra 算法类似,都是以松弛操作作为基础。Dijkstra 算法以贪心法选取未被处理的具有最小权值的节点,然后对其进行松弛操作;而 Bellman-Ford 算法对所有边都进行松弛操作,共 n-1 次。因为负环可以无限制地减少最短路径长度,所以吐过发现第 n 次操作仍然可松弛,则一定存在负环。Bellman-Ford 算法最长运行时间为O(nm),其中 n 和 m 分别是节点数和边数。

二 算法步骤

1 数据结构

因为需要利用边进行松弛,因此采用边集数组存储。每条边都有三个域:两个端点a和b,以及边权w

2 松弛操作

对所有的边 j(a,b,w),如果 dis[e[j]b]>dis[e[j].a]+e[j].w,则松弛,另 dis[e[j]b]=dis[e[j].a]+e[j].w。其中,dis[v] 表示从源点到节点 v 的最短路径长度。

3 重复松弛操作 n-1 次

4 负环判断

再执行一次松弛操作,如果仍然可以松弛,则说明右负环。

三 算法实现

package graph.bellmanford; import java.util.Scanner; public class BellmanFord {    static node e[] = new node[210];    static int dis[] = new int[110];    static int n;    static int m;    static int cnt = 0;     static {        for (int i = 0; i < e.length; i++) {            e[i] = new node();        }    }     static void add(int a, int b, int w) {        e[cnt].a = a;        e[cnt].b = b;        e[cnt++].w = w;    }     static boolean bellman_ford(int u) { // 求源点 u 到其它顶点的最短路径长度,判负环        for (int i = 0; i < dis.length; i++) {            dis[i] = 0x3f;        }        dis[u] = 0;        for (int i = 1; i < n; i++) { // 执行 n-1 次            boolean flag = false;            for (int j = 0; j < m; j++) // 边数 m 或 cnt                if (dis[e[j].b] > dis[e[j].a] + e[j].w) {                    dis[e[j].b] = dis[e[j].a] + e[j].w;                    flag = true;                }            if (!flag)                return false;        }        for (int j = 0; j < m; j++) // 再执行 1 次,还能松弛说明有环            if (dis[e[j].b] > dis[e[j].a] + e[j].w)                return true;        return false;    }      static void print() { // 输出源点到其它节点的最短距离        System.out.println("最短距离:");        for (int i = 1; i <= n; i++)            System.out.print(dis[i] + " ");        System.out.println();    }     public static void main(String[] args) {        int a, b, w;        Scanner scanner = new Scanner(System.in);        n = scanner.nextInt();        m = scanner.nextInt();        for (int i = 0; i < m; i++) {            a = scanner.nextInt();            b = scanner.nextInt();            w = scanner.nextInt();            add(a, b, w);        }        if (bellman_ford(1)) // 判断负环            System.out.println("有负环!");        else            print();    }} class node {    int a;    int b;    int w;}

四 测试

1 没有负环的测试

Java Bellman-Ford算法原理及实现方法

2 有负环的测试

Java Bellman-Ford算法原理及实现方法

“Java Bellman-Ford算法原理及实现方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯