迪杰斯特拉 算法求最短路径

这段代码实现了一个基于Floyd-Warshall算法找出两点间最短路径的问题,其中路径的长度用两点间的最小公倍数(LCM)表示。程序首先初始化一个2050x2050的矩阵来存储距离,然后通过遍历计算所有可能的路径,更新最短距离。同时,提供了计算最大公约数(GCD)和最小公倍数(LCM)的辅助函数。
摘要由CSDN通过智能技术生成
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);

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值