队列中的优先级在Dijkstra的算法中表现得很奇怪?

时间:2013-12-21 01:29:33

标签: java algorithm

我用优先级队列实现了Dijkstra的算法。除了测试用例的这个特殊实例之外,一切都很完美,我不明白优先级队列是如何工作的。对于某些背景,在我的应用程序中,我将(行,列)形式的输入转换为节点,每个行和列都是双向节点。当我使用测试输入运行此算法并且优先级队列选择距离为99999而不是4的节点时,会发生主要错误!我的意思是,当我比较节点的优先级时,它们实现了一个可比较的距离(当前节点和源节点之间)。所有未访问的节点都设置为999999(无穷大)。因此,访问的节点将被选择为下一个当前节点,而不是图中的某个随机节点。

以下代码是由优先级队列实现的Dijkstra算法。 The project on github.

public static void execute(int source){
      PriorityQueue<Vertex> pQueue = new PriorityQueue<Vertex>();

        // Set the first node as source node 
        int diameter =0;
        existingVertex.get(source).setDistance(0);

        // Add all nodes into a heap
        pQueue.addAll(existingVertex);
            while (!pQueue.isEmpty()){

                    // Take out first node
                    Vertex n = pQueue.remove();
                    n.setVisited(true);
                    System.out.println("current node=" + n.id);

                    for (Edge e: n.getOutgoingEdges()){
                            Vertex adjNode = e.getDestination();
                            System.out.println("adjNode id=" +adjNode.id);
                            Integer newPossiblePathCost = 1+ n.getDistance();
                            if (Boolean.FALSE.equals(adjNode.isVisited())) {

                            if (newPossiblePathCost<adjNode.getDistance()){
                             adjNode.setDistance(newPossiblePathCost); 
                             System.out.println("Distance:" + adjNode.distance);
                                    // update
                             pQueue.remove(adjNode);
                             pQueue.add(adjNode);}}
                    }

                    // Save the diameter of the traversed graph
                    if(n.getDistance() > diameter  && n.getDistance() != 999999)
                    {
                        diameter = n.getDistance();
                    }
            }       

            diameterlist.add(diameter);

    }

测试用例:

    1 14 1 2 2 15 3 15 4 15 5 15 6 15 7 15 8 15 9 15 10 15 11 15 12 15 13 15

输出:

  1. 当前节点= 14
  2. adjNode id = 1
  3. 距离:1
  4. 当前节点= 1
  5. adjNode id = 14
  6. adjNode id = 2
  7. 距离:2
  8. 当前节点= 2
  9. adjNode id = 1
  10. adjNode id = 15
  11. 距离:3
  12. 当前节点= 13
  13. adjNode id = 15
  14.  
  15. 当前节点= 15
  16. 有人可以向我解释为什么会这样吗?

0 个答案:

没有答案