我用优先级队列实现了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);
}
测试用例:
输出:
有人可以向我解释为什么会这样吗?