迪杰斯特拉算法

import java.util.*;
public class Main {
    public static void main(String[] args) {
        int[][] e = new int[2022][2022];
        int[] dist = new int[2022];
        boolean[] visit = new boolean[2022];
        Arrays.fill(dist, Integer.MAX_VALUE);
        for(int i = 1; i <= 2021; i++){ // 构建邻接矩阵
          for(int j = 1; j <= 2021; j++){
            if(i == j){
              e[i][j] = 0;
            }else{
              if(Math.abs(i - j) <= 21){
                e[i][j] = i * j / gcd(i, j);
              }
              else{
                e[i][j] = Integer.MAX_VALUE;
              }
            }
          }
        }
        
        // 从 顶点 1 到达其他顶点的最短路劲!
        dist[1] = 0;
        // 遍历所有顶点!
        for(int i = 1; i <= 2021; i++){// 更新从顶点 1 能够到达的所有顶点的最短路径!
          int u = 0, min = Integer.MAX_VALUE;
          for(int j = 1; j <= 2021; j++){// 从未遍历的顶点中找到最近的顶点以及路劲长度!
            if(!visit[j] && dist[j] < min){
              min = dist[j];
              u = j;
            }
          }
          
          visit[u] = true; // 做标记!
          for(int j = 1; j <= 2021; j++){ // 找最近顶点能直接到达的其他顶点的最短路劲!
            if(e[u][j] != Integer.MAX_VALUE && dist[u] + e[u][j] < dist[j]){
              dist[j] = dist[u] + e[u][j];
            }
          }
        }
        System.out.println(dist[2021]);
    }
    static int gcd(int a, int b){
      return b == 0 ? a : gcd(b, a % b);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值