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

迪杰斯特拉算法的实现和普里姆算法的实现大同小异,几乎没什么区别

普里姆算法求最小生成树:https://mp.csdn.net/postedit/90763065

1.首先创建一个二维邻接矩阵

顶点集合{v0,v1,v2,v3,v4}  边集{(v0,v1,1),(v1,v2,2),(v2,v3,3),(v3,v4,4),(v4,v0,5),(v1,v4,3)}  (起点,终点,权值)

0           1          65535   65535   5   
1           0          2           65535   3   
65535   2          0           3           65535   
65535   65535  3           0           4   
5           3          65535   4           0   

注意:0代表到自身没有边,权值为0   65535 代表与其他顶点没有边,权值无穷大

2.实现与测试

图的数据结构

public class Graph {
    String[] vertex = new String[5];    //顶点类型可自定义
    int[][] edge = new int[5][5];       //边的类型可自定义

//省略get,set方法}

public class ShotestPath {

    /**
     * 迪杰斯特拉算法
     *
     * @param g
     */
    public static void shotestPath_dijkstra(Graph g){
        int []pathmatirx = new int[100];   //存放最短路径下标的数组  该下标对应的一个顶点与最短路径的最后一个顶点相连
        int []shotestPath = new int[100];  //存放到各个顶点的最短路径
        int []adjvex = new int[100];        //存放顶点下标,如果为1表示顶点已纳入最短路径

        //初始化数组
        for(int i = 0; i < g.getVertex().length; i++){
            pathmatirx[i] = 0;
            shotestPath[i] = g.getEdge()[0][i];
            adjvex[i] = 0;
        }

        adjvex[0] = 1;  //表示把v0纳入最短路径,因为v0到自身路径为0

        for(int i = 1; i < g.getVertex().length; i++){      //循环 顶点数-1次
            int min = 65535;   //首先设置最小值为无穷大, 在次选择不常用数组 65535  可自定义,必须大于所有权值
            int index = 0;
            for(int j = 0; j < g.getVertex().length; j++){
                if(adjvex[j] !=1 && min > shotestPath[i]){      //第j各顶点不能是最短路径中的顶点
                    min = shotestPath[i];
                    index = j;   //此时最小值的顶点的位置
                }
            }

            adjvex[index] = 1;   //表示index位置的顶点纳入最短路径

            for(int j = 0; j < g.getVertex().length; j++){
                if(adjvex[j] !=1 && (g.getEdge()[index][j] + min) < shotestPath[j]){
                    shotestPath[j] = g.getEdge()[index][j] + min;
                    pathmatirx[j] = index;
                }
            }
        }


        for(int i = 0; i < g.getVertex().length; i++){
            System.out.println("到v" + i + "最短路径" + shotestPath[i]);
            System.out.println("该最短路径的最后一条边:(v" + pathmatirx[i] + ",v" + i +")");
        }

    }
}

3.测试结果

到v0最短路径0
该最短路径的最后一条边:(v0,v0)
到v1最短路径1
该最短路径的最后一条边:(v0,v1)
到v2最短路径3
该最短路径的最后一条边:(v1,v2)
到v3最短路径6
该最短路径的最后一条边:(v2,v3)
到v4最短路径4
该最短路径的最后一条边:(v1,v4)

 

迪杰斯特拉算法与普里姆算法唯一的区别是,存放权值的数组shotestPath作用不同

      迪杰斯特拉算法:该数组存放到各个顶点的最短路径

      普里姆算法:该数组存放生成树到其他顶点的路径,不包括生成树里的顶点,即到生成树里包含的顶点的路径为0

你可能感兴趣的:(迪杰斯特拉算法求最短路径)