最短路径算法

迪杰斯特拉算法

思想:先找到所有点中路径最小的,再以路径最小的点作为中转站,遍历在当前已经查找到的基础上的查找更小的路径
在这里插入图片描述

// 最短路径算法
// 可以使用一个三角形形式进行记忆
public class ShortestPath {
    public static int INF = Integer.MAX_VALUE;
   // param
   //   @adjMatrix:邻接矩阵
   //   @v0:查找v0到各个点的最短路径
   public static int[] dijkstra(int[][] adjMatrix,int v0){
       int vnum = adjMatrix.length;
       int[] p = new int[vnum];// 前驱结点
       int[] distance = new int[vnum];// 最短路径
       boolean[] flag = new boolean[vnum];// 已经查找到最短路径的结点

       // 初始化
       for (int i=0;i<vnum;i++){
            flag[i] = false;
            distance[i] = adjMatrix[v0][i];
            p[i] = v0;// 初始前驱都为v0
       }
       flag[v0] = true;
       distance[v0] = 0;

       // 每次查找1个顶点的最短路径
       // 排除顶点v0共i-1次
       int min = INF;
       int k = 0;
       for(int i=1;i<vnum;i++){
           // 查找当前最短路径
           for (int w=0;w<vnum;w++){
               if (!flag[w]&&distance[w]<min){
                   k = w;
                   min = distance[w];
               }
           }
           flag[k] = true;// 顶点k查找到

           // 修正最短路径
           for (int w=0;w<vnum;w++){
               if (!flag[w]&&min+adjMatrix[k][w]<distance[w]){
                   distance[w] = min + adjMatrix[k][w];
                   p[w] = k;
               }
           }
       }

       return p;
   }
}

弗洛伊德算法

求任意两点之间的最短路径

参考
https://www.cnblogs.com/wangyuliang/p/9216365.html

   // 弗洛伊德算法
   public static int[][]  floyd(int[][] adjMatrix){
       int vnum = adjMatrix.length;

       for (int k=0;k<vnum;k++){
           for (int i=0;i<vnum;i++){
               for (int j=0;j<vnum;j++){
                   if (adjMatrix[i][j]>adjMatrix[i][k]+adjMatrix[k][j]){
                       adjMatrix[i][j] = adjMatrix[i][k] + adjMatrix[k][j];
                   }
               }
           }
       }


       for (int i=0;i<vnum;i++){
           for(int j=0;j<vnum;j++){
               System.out.print(adjMatrix[i][j]+" ");
           }
           System.out.println(" ");
       }



       return adjMatrix;
   }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值