【问题标题】:Dijkstra's algorithm - priority queue issueDijkstra 算法 - 优先队列问题
【发布时间】:2012-11-27 22:54:59
【问题描述】:

我有一个带有一堆节点、边等的 Graph 类,我正在尝试执行 Dijkstra 算法。我开始将所有节点添加到优先级队列中。每个节点都有一个布尔标志,表明它是否已经“已知”,对它之前的节点的引用,以及一个存储其来自源节点的长度的 int dist 字段。在将所有节点添加到 PQ 并适当标记源节点之后,我注意到错误的节点首先从 PQ 中拉出。应该是具有最小 dist 字段的节点首先出现(因为除了源之外,它们都被初始化为一个非常高的数字,所以 PQ 之外的第一个节点应该是源......除了它不适合某些原因)。 下面是我的算法代码,后面是我的 Node 类中的 compare 方法。

    public void dijkstra() throws IOException {
    buildGraph_u();
    PriorityQueue<Node> pq = new PriorityQueue<>(200, new Node());

    for (int y = 0; y < input.size(); y++) {
        Node v = input.get(array.get(y));
        v.dist = 99999;
        v.known = false;
        v.prnode = null;
        pq.add(v);
    }

    source.dist = 0;
    source.known = true;
    source.prnode = null;
    int c=1;
    while(c != input.size()) {
        Node v = pq.remove();
        //System.out.println(v.name);
                    //^ Prints a node that isn't the source
        v.known = true;
        c++;
        List<Edge> listOfEdges = getAdjacent(v);
        for (int x = 0; x < listOfEdges.size(); x++) {
            Edge edge = listOfEdges.get(x);
            Node w = edge.to;
            if (!w.known) {
                int cvw = edge.weight;
                if (v.dist + cvw < w.dist) {
                    w.dist = v.dist + cvw;
                    w.prnode = v;
                }
            }
        }
    }
}

public int compare (Node d1, Node d2) {
       int dist1 = d1.dist;
       int dist2 = d2.dist;
       if (dist1 > dist2) 
         return 1;
       else if (dist1 < dist2) 
         return -1;
       else 
         return 0;
     }

谁能帮我找出我的 PQ 的问题?

【问题讨论】:

  • 快速观察一下,如果一个排序的实体首先返回错误的节点,我假设比较器是向后的。您看起来不错,但尝试颠倒 1 和 -1 的值,看看代码是否有效?
  • Nope =/ 再看一下——我认为我的 PQ 创建了新的节点对象,因此我更改了与源节点关联的一些字段并不会影响它。有没有办法自己添加节点?

标签: java priority-queue dijkstra


【解决方案1】:

优先级队列假设插入元素后顺序不会改变。

因此,您可以:

  1. 从一个节点开始。

  2. 优先级队列不为空时循环。

  3. 如果元素“已知”,则什么也不做。

  4. 每当您发现较小的距离时,将其添加到具有“正确”权重的优先级队列中。

  5. 所以你需要在优先级队列中存储一个else,一对:插入时的距离,节点本身。

【讨论】:

  • 第一句话就是我需要阅读以纠正问题的全部内容!谢谢!
猜你喜欢
  • 2013-12-23
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多