public class zuiduanlujing {
static int[][] G=new int[2050][2050]; //这数组记录从某点到某点的距离,数组中的两个值分
别是两点的位置
static final int INF=1000000000; //给定一个最大的值,赋值给每个点
public static void main(String[] args) {
for (int i=1;i<=2021;i++){
for (int j=1;j<=2021;j++){
G[i][j]=INF; //给每个点赋值
}
}
for (int i=1;i<=2021;i++){
int temp=Math.max(1,i-21); //确保两个数的差小于21
for (int j=temp;j<=i;j++){
int lcm=lcm(i,j); //满足条件时求最小公倍数
G[i][j]=lcm; //把最小公倍数的值给这个数组,即两点间距离
G[j][i]=lcm;
}
}
floyd();
System.out.println(G[1][2021]);
}
private static void floyd() { //该方法便是筛选出最短的路径
for (int k=1;k<=2021;k++){
for (int i=1;i<=2021;i++){
for (int j=1;j<=2021;j++){
if (i != j && G[i][j] > G[i][k]+G[k][j]) { // k表示的是中间的过度点,
例如A->B->C和A->C中k
就表示B,i表示A,j表示C
G[i][j] = G[i][k]+G[k][j]; //满足条件就替换掉
}
}
}
}
}
public static int gcd(int a,int b){ //求最大公约数
if (b==0){
return a;
}else {
return gcd(b,a%b);
}
}
public static int lcm(int a,int b){ //求最小公倍数
int gcd = gcd(a, b);
return gcd*(a/gcd)*(b/gcd);
}
}
迪杰斯特拉 算法求最短路径
最新推荐文章于 2023-05-20 14:52:31 发布
这段代码实现了一个基于Floyd-Warshall算法找出两点间最短路径的问题,其中路径的长度用两点间的最小公倍数(LCM)表示。程序首先初始化一个2050x2050的矩阵来存储距离,然后通过遍历计算所有可能的路径,更新最短距离。同时,提供了计算最大公约数(GCD)和最小公倍数(LCM)的辅助函数。
摘要由CSDN通过智能技术生成