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

来源:互联网 发布:淘宝古董钟表 编辑:程序博客网 时间:2024/06/07 11:51

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();    }      }  }}


原创粉丝点击