解决带负权边的最短路径算法——BellmanFord算法

代码

import java.util.Scanner;

/**
 * 解决带负权边的最短路径算法——BellmanFord
 * @author XZP
 *
 */
public class BellmanFord {

    public static void main(String[] args) {
        int INF = 9999; // 定义一个认为的最大值
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt(); // 顶点数
        int M = sc.nextInt(); // 边数
        int[] dis = new int[N]; // 放最短路径的距离
        // 声明uvw三个数组,用于表示u[i]到v[i]两个顶点之间的权重为w[i]
        int[] u = new int[N];
        int[] v = new int[N];
        int[] w = new int[N];
        // 读入边
        for (int i = 0; i < M; i++) {
            u[i] = sc.nextInt();
            v[i] = sc.nextInt();
            w[i] = sc.nextInt();
        }
        
        // 初始化dis数组:1号顶点到其他顶点之间的初始路程(下标0开始)
        for (int i = 1; i < N; i++) {
            dis[i] = INF;
        }
        dis[0] = 0;
        // BellmanFord算法的核心语句
        for (int k = 0; k < N -1; k++) { // n个顶点的情况下,其中一个顶点到其他所有顶点之间至多有n-1条边,进行n-1次松弛
            for (int i = 0 ; i < M; i++) {
                if (dis[v[i]] > dis[u[i]] + w[i]) {
                    dis[v[i]] = dis[u[i]] + w[i];
                }
            }
        }
        
        // 输出结果
        for (int i = 0; i < N; i++) {
            System.out.print(dis[i] + " ");
        }
    }

}

几点注意

  • 时间复杂度O(M * N)
  • 显然还可以优化
  • 可用于检测是否图带有负权边
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,117评论 2 89
  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 11,801评论 5 24
  • 毕业半年多,因为要考公共英语所以又开始学习英语,现在看看自己的笔记,单词和句型是肯定看得懂的,偏偏语法,之前可是一...
    Sissi吖阅读 2,361评论 0 0
  • 本来打算平安度过期末考后再开始写文章的我在复习困累时偶尔听了一篇文章后,内心突然就产生了一种打破原定计划的执拗,于...
    泡芙小姐很坚持阅读 3,535评论 1 1