• 迪杰斯特拉(Java)


     1 public class Dijsktra {
     2         
     3     public static void main(String[] args)
     4     {
     5         Dijsktra d=new Dijsktra();
     6         int[][] w={{0,1},{2,0}};
     7         
     8         int[] a=d.DijsktraWay(w,0);
     9         //System.out.println(1111);
    10     }
    11 
    12     // 返回来的是路径
    13     public int[] DijsktraWay(int[][] weight, int start) {
    14 
    15         // 接受一个有向图的权重矩阵�和一个起点编号start�从0编号�顶点存在数组中�
    16         // 返回一个int[] 数组�表示从start到它的最短路径长度
    17         int n = weight.length; // 顶点个数
    18         
    19         int[] shortPath = new int[n]; // 存放从start到其他各点的最短路径
    20         String[] path = new String[n]; // 存放从start到其他各点的最短路径的字符串表示
    21         for (int i = 0; i < n; i++) {
    22             path[i] = new String(start + ">" + i);
    23             shortPath[i] = Integer.MAX_VALUE / 2;
    24         }
    25         int[] visited = new int[n]; // 标记当前该顶点的最短路径是否已经求出,1表示已求出
    26         // 初始化�第一个顶点求出
    27         shortPath[start] = 0;//没有环
    28         visited[start] = 1; // 表示已经访问过
    29 
    30         for (int count = 1; count <= n - 1; count++) // 要加入n-1个顶点,每次加入一个点后
    31             //就会有一个点被标记
    32         {
    33             int k = -1; // 选出一个距离初始顶点start最近的未标记顶点
    34             int dmin = Integer.MAX_VALUE / 2;
    35             for (int i = 0; i < n; i++) {
    36                 //如果此点未访问并且距离起始点距离较上一个的小,则应进行修改
    37                 if (visited[i] == 0 && weight[start][i] < dmin) {
    38                     dmin = weight[start][i];//表示距离起始点最近的点
    39                     k = i;//将距离起始点最近的点标记为k
    40                 }
    41             }
    42             
    43             if (k == -1) {
    44                 break;
    45                 // return null;
    46             }
    47             // 将新选出的顶点标记为已求出最短路径�且到start的最短路径就是dmin
    48             shortPath[k] = dmin;
    49             visited[k] = 1;
    50             // 以k为中间点�修正从start到未访问各点的距离
    51             for (int i = 0; i < n; i++) {
    52                 if (visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]) {
    53                     weight[start][i] = weight[start][k] + weight[k][i];
    54                     path[i] = path[k] + ">" + i;
    55                 }
    56                 //System.out.println(shortPath[i]);
    57                 System.out.println( path[i]);
    58             }
    59         }
    60 
    61         
    62         return shortPath;
    63     }
    64     
    65 }

       

    确定起点的最短路径问题:即已知起始结点,求最短路径的问题。适合迪杰斯特拉算法。

    确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径反转的确定起点的问题。

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/xh0102/p/5777826.html
Copyright © 2020-2023  润新知