gcd,Lcm,Dijkstra算法

  • GCD:求两个数的最大公约数
  int gcd(int a,int b){
      return b==0?a:gcd(b,a%b);
  }
  • LCM:求两个数的最小公倍数
  int Lcm(int a,int b){
      return a*gcd(a,b)/b;
  }
  • Dijkstra求最短路径
    每次找离出发点距离最近的点,维护其邻居距离出发点的最短路径
  //根据结点数量改变
        final int N = 10001;
        final int INF = Integer.MAX_VALUE;
        //初始化图
        int[][] g = new int[N][N];
        //记录到出发点的最短路径,初始化为INF
        int[] minDist = new int[N];
        //记录已处理结点
        boolean[] vis = new boolean[N];
        Arrays.fill(minDist,INF);
        //优先队列维护最短路径
        PriorityQueue<int[]> pq = new PriorityQueue<>((a,b)->(a[1]-b[1]));
        pq.add(new int[]{0,0});
        while(!pq.isEmpty()){
            int[] x = pq.poll();
            //分别代表下标与距离
            int i = x[0];
            int dis = x[1];
            //找邻居
            for(int j = 0;j < N;j++){
                int d = g[i][j];
                if(dis+d<minDist[j]&&!vis[j]){
                    pq.add(new int[]{j,dis+d});
                    minDist[j] = dis+d;
                }
            }
            vis[i] = true;
        }
posted @ 2025-04-02 23:40  m1kasaz  阅读(13)  评论(0)    收藏  举报