Dijkstra算法

概念

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

原理

贪心(略)

为什么Dijkstra算出来的是最短路径?

代码实现

说明:

1. 图的表示采用邻接矩阵方式

2. 计算出来的是源点到其余所有端点的距离

3. sptSet[]表示已经计算出最短距离的所有端点,dis[]表示距离

package path;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class ShortestPath {
    public int getMinValue(int[] dis, boolean[] sptSet) {
        int minVal = Integer.MAX_VALUE;
        int index = -1;
        for (int i = 0; i < dis.length; i++) {
            if (!sptSet[i] && dis[i] < minVal) {
                minVal = dis[i];
                index = i;
            }
        }
        return index;
    }

    public int[] dijkstra(int[][] graph, int src) {
        int len = graph.length;
        int[] dis = new int[len];
        boolean[] sptSet = new boolean[len];
        HashMap<Integer, List<Integer>> hashMap = new HashMap<>();
        for (int i = 0; i < len; i++) {
            dis[i] = Integer.MAX_VALUE;
            List<Integer> list = new ArrayList<>();
            list.add(src);
            hashMap.put(i, list);
        }
        dis[src] = 0;
        // sptSet[src] = true;

        for (int count = 0; count < len; count++) {
            int u = getMinValue(dis, sptSet);
            sptSet[u] = true;
            for (int v = 0; v < len; v++) {
                if (!sptSet[v] && graph[u][v] != 0 && dis[v] > dis[u] + graph[u][v]) {
                    dis[v] = dis[u] + graph[u][v];
                }
            }
        }

        return dis;
    }

    public static void main(String[] args) {
        /* Let us create the example graph discussed above */
        int graph[][] = new int[][] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },
                { 4, 0, 8, 0, 0, 0, 0, 11, 0 },
                { 0, 8, 0, 7, 0, 4, 0, 0, 2 },
                { 0, 0, 7, 0, 9, 14, 0, 0, 0 },
                { 0, 0, 0, 9, 0, 10, 0, 0, 0 },
                { 0, 0, 4, 14, 10, 0, 2, 0, 0 },
                { 0, 0, 0, 0, 0, 2, 0, 1, 6 },
                { 8, 11, 0, 0, 0, 0, 1, 0, 7 },
                { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };
        ShortestPath t = new ShortestPath();
        int[] dis = t.dijkstra(graph, 0);
        System.out.println(Arrays.toString(dis));
        // HashMap hashMap = new HashMap();
        // hashMap.get();
    }
}

参考资料

1. https://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

2. https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/

posted on 2019-12-20 14:01  harry1989  阅读(496)  评论(0编辑  收藏  举报

导航