Bellman-ford算法求解单源点最短路径初始版本

Bellman-ford算法:

可以用来求解负的权值的图

对每个边进行枚举,最多进行n-1轮循环即可找到所有的最短路径,很多时候会少于n-1轮,所以加了check,代码里面已经比较清楚啦,


import java.util.*;
public class Main {
    static Scanner in  = new Scanner(System.in);
    static int INF = 99999999;
    static int[] dis = new int[100];
    static int[] bck= new int[100];
    static int[] v = new int[100];
    static int[] u= new int[100];
    static int[] w = new int[100];
    static int n,m;
    public static void main(String[] args) {
        while(in.hasNext()){
            int check=0,flag=0;
             n = in.nextInt();
             m = in.nextInt();
         //存储每一条边的信息,起点终点权值
         for (int i = 1; i <= m; i++) {
            u[i] = in.nextInt();
            v[i] = in.nextInt();
            w[i] = in.nextInt();
          }
         //初始化dis数组
        for (int i = 1; i <= n; i++)
             dis[i]=INF;
        //假设从1点求解最短路径
         dis[1]=0;         
         //最短路径最长路过n-1个顶点,最多扩展n-1轮
         for (int k = 1; k <= n-1; k++) {
             check=0;
             bck=Arrays.copyOf(dis,dis.length);
            for (int i = 1; i <= m; i++) {
            //当前这条边,即1到v的距离小于1到u,u到v的距离,更新
              if(dis[v[i]]>dis[u[i]]+w[i])
                dis[v[i]]=dis[u[i]]+w[i];				
            }
            //用来检查一轮之后若dis数组没有改变,说明已经完成,停止循环
            if(bck.equals(dis)){
                check=1;
                break;
            }
        }
         //如果存在负权回路,由于每次经过一次回路都会距离减小,所以dis如果经过最多n-1轮之后还会减小,说明存在负权回路
         for (int i = 1; i <= m; i++) {
             if(dis[v[i]]>dis[u[i]]+w[i])
                 flag=1;
        }
         if(flag==1){
             System.out.println("存在负权回路");
         }
        else{
          for (int i = 1; i <= n; i++) 
             System.out.print(dis[i]+" ");			
        System.out.println();
        } 
     }
  }
}

















    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/JingleLiA/article/details/78011530
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞