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



















你可能感兴趣的:(图论)