【发布时间】:2011-10-20 15:02:54
【问题描述】:
我正在尝试实现 Dijkstra 的算法,以使用优先级队列查找最短路径。在算法的每一步中,我从优先级队列中删除距离最短的顶点,然后更新优先级队列中每个邻居的距离。现在我读到,当您编辑其中的元素(确定排序的元素)时,Java 中的优先级队列不会重新排序,所以我试图通过插入和删除一个虚拟顶点来强制它重新排序。但这似乎不起作用,我一直试图弄清楚。
这是顶点对象和比较器的代码
class vertex {
int v, d;
public vertex(int num, int dis) {
v=num;
d=dis;
}
}
class VertexComparator implements Comparator {
public int compare (Object a, Object b) {
vertex v1 = (vertex)a;
vertex v2 = (vertex)b;
return v1.d-v2.d;
}
}
这是我运行算法的地方:
int[] distances=new int[p];
Comparator<vertex> comparator = new VertexComparator();
PriorityQueue<vertex> queue = new PriorityQueue<vertex>(p, comparator);
for(int i=0; i<p; i++) {
if(i!=v) {
distances[i]=MAX;
}
else {
distances[i]=0;
}
queue.add(new vertex(i, distances[i]));
}
// run dijkstra
for(int i=0; i<p; i++) {
vertex cur=queue.poll();
Iterator itr = queue.iterator();
while(itr.hasNext()) {
vertex test = (vertex)(itr.next());
if(graph[cur.v][test.v]!=-1) {
test.d=Math.min(test.d, cur.d+graph[cur.v][test.v]);
distances[test.v]=test.d;
}
}
// force the PQ to resort by adding and then removing a dummy vertex
vertex resort = new vertex(-1, -1);
queue.add(resort);
queue.remove(resort);
}
我已经运行了几个文本案例,并且我知道每次通过并更新顶点距离时优先级队列都没有正确重新排序,但我不知道为什么。我是不是在某个地方出错了?
【问题讨论】:
标签: java priority-queue