繁体   English   中英

了解 java 代码中 Dijkstra Shortest path 的一部分

[英]Understanding a part of Dijkstra Shortest path in java code

任何人都可以向我解释这个代码,它是 java 代码的一部分,作为 Dijkstra 最短路径的数据结构的应用程序

 PriorityQueue<Pair<Integer, Integer>> pq = new PriorityQueue<>(vertices, new Comparator<Pair<Integer, Integer>>() {
        @Override
        public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
            int key1 = p1.getKey();
            int key2 = p2.getKey();
            return key1-key2;
        }
    });

注:完整代码为

public String Shortest_Path(int sourceVertex){
    boolean[] SPT = new boolean[vertices];
    int [] distance = new int[vertices];

    for (int i = 0; i <vertices ; i++) {
        distance[i] = Integer.MAX_VALUE;
    }

    PriorityQueue<Pair<Integer, Integer>> pq = new PriorityQueue<>(vertices, new Comparator<Pair<Integer, Integer>>() {
        @Override
        public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
            int key1 = p1.getKey();
            int key2 = p2.getKey();
            return key1-key2;
        }
    });

    distance[0] = 0;
    Pair<Integer, Integer> p0 = new Pair<>(distance[0],0);
    pq.add(p0);

    while(!pq.isEmpty()){
        Pair<Integer, Integer> extractedPair = pq.poll();
        int extractedVertex = extractedPair.getValue();
        if(SPT[extractedVertex] == false) {
            SPT[extractedVertex] = true;

            LinkedList<Edge> list = adjacencylist[extractedVertex];
            for(int i = 0; i < list.size(); i++) {
                Edge edge = list.get(i);
                int destination = edge.destination;

                if (SPT[destination] == false) {
                    int newKey =  distance[extractedVertex] + edge.weight ;
                    int currentKey = distance[destination];
                    if(currentKey>newKey){
                        Pair<Integer, Integer> p = new Pair<>(newKey, destination);
                        pq.add(p);
                        distance[destination] = newKey;
                    }
                }
            }
        }
    }

这是 PriorityQueue 用于在您的代码中获得最小权重边缘,它是Pair

向 PQ 的构造函数声明的比较器用于比较两对进行堆化

PQ 并获得最小边缘,因此当您调用Poll()方法时,将获取最小值

顶点之间的边

PriorityQueue<Pair<Integer, Integer>> pq = new PriorityQueue<>(vertices, new Comparator<Pair<Integer, Integer>>() {
        @Override
        public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
            int key1 = p1.getKey();
            int key2 = p2.getKey();
            return key1-key2;
        }
    });

当您在代码中调用pq.poll()时,优先级队列会返回最小权重边缘。 这是通过确保优先级队列的元素按权重的升序排列来完成的。

由于边表示为Pair对象,因此未定义自然排序。 您询问的代码是指定 PriorityQueue 的排序标准的位置。 IE。 A Pair有 2 个数据。 一个键和一个值。 在这段代码中,指定比较key s 对PriorityQueue 进行排序。

要添加sc0dersaki的两个好的答案:

来自PriorityQueue 构造函数文档

创建一个具有指定初始容量的 PriorityQueue,根据指定的比较器对其元素进行排序

来自Comperator 文档

比较 function,它对某些对象集合施加了总排序。

和:

返回负 integer、零或正 integer,因为第一个参数小于、等于或大于第二个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM