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