最短路径算法Dijkstra及和Prim算法区别

算法

这里写图片描述

这里写图片描述

 @org.junit.Test
    public void testDijkstra() {
        int[][] adj = {
                {0, 2, INF, 1, INF, INF, INF},
                {INF, 0, INF, 3, 10, INF, INF},
                {4, INF, 0, INF, INF, 5, INF},
                {INF, INF, 2, 0, 2, 8, 4},
                {INF, INF, INF, INF, 0, INF, 6},
                {INF, INF, INF, INF, INF, 0, INF},
                {INF, INF, INF, INF, INF, 1, 0},
        };
        dijkstra(adj);

    }


    public void dijkstra(int[][] adjMatrix) {
        //节点数
        int count = adjMatrix[0].length;
        //初始节点定为0
        int cur = 0;

        //dist[index]表示 节点index 借助 集合U 到达顶点的最小距离
        int[] dist = new int[count];

        //集合U初始化只包含初始节点
        for (int i = 0; i < count; i++) {
            dist[i] = adjMatrix[cur][i];
        }
        boolean[] visit = new boolean[count];
        visit[cur] = true;
        System.out.println("vertex->" + cur);
        for (int i = 1; i < count; i++) {//找节点的次数
            int nearBy = 0;
            int dis = INF;
            //每次找通过集合U到顶点的距离最短的未访问节点
            for (int j = 0; j < count; j++) {
                if (!visit[j] && dist[j] < dis) {
                    nearBy = j;
                    dis = dist[j];
                }
            }
            if (dis == INF){
                return ;
            }
            visit[nearBy] = true;
            System.out.println("vertex->" + nearBy);
            //更新其他未访问节点通过集合U到顶点的距离(集合U增加了nearBy节点)
            for (int j = 0; j < count; j++) {
                if (!visit[j] && adjMatrix[nearBy][j]!=INF && dist[j] > dist[nearBy] + adjMatrix[nearBy][j]) {
                    dist[j] = dist[nearBy] + adjMatrix[nearBy][j];
                }
            }
        }
    }

结果

这里写图片描述

Dijkstra及和Prim算法区别

这里引用一个百度知道的回答:
在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法。

二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的挑选权值最低的点加入U,那么二者是否等价呢?

也就是说是否Dijkstra也可以计算出最小生成树而Prim也可以计算出从第一个顶点v0到其他点的最短路径呢?答案是否定的,否则就不必有两个算法了。

二者的不同之处在于“权值最低”的定义不同,Prim的“权值最低”是相对于U中的任意一点而言的,也就是把U中的点看成一个整体,每次寻找V-U中跟U的距离最小(也就是跟U中任意一点的距离最小)的一点加入U;而Dijkstra的“权值最低”是相对于v0而言的,也就是每次寻找V-U中跟v0的距离最小的一点加入U。

猜你喜欢

转载自blog.csdn.net/momo_ibeike/article/details/79668949