zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    mysql用户密码修改
    Java List java.lang.UnsupportedOperationException
    python __dict__
    pytest.fixture
    Python __metaclass__ 解释
    Python __new__()方法,为对象分配内存 返回对象的引用
    git 常用操作
    boto3 dynamodb 一些简单操作
    conda, pip, virtualenv 区别
    list去重后不改变排序
  • 原文地址:https://www.cnblogs.com/harry1989/p/12072775.html
Copyright © 2011-2022 走看看