Я пытаюсь реализовать алгоритм Дейкстры для поиска кратчайших путей с использованием очереди приоритетов. На каждом шаге алгоритма я удаляю вершину с кратчайшим расстоянием из очереди приоритетов, а затем обновляю расстояния для каждого из ее соседей в очереди приоритетов. Теперь я прочитал, что приоритетная очередь в 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);
}
Я запускал несколько текстовых случаев и знаю, что очередь приоритетов неправильно переупорядочивается каждый раз, когда я прохожу и обновляю расстояния для вершин, но я не знаю почему. Я где-то сделал ошибку?