Переупорядочивание очереди приоритетов Java при редактировании элементов

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

Я выполнил несколько текстовых случаев и знаю, что приоритетная очередь не переупорядочивается правильно каждый раз я прохожу и обновляю расстояния для вершин, но я не знаю почему. Я где-то сделал ошибку?

24
задан hammar 29 May 2013 в 16:47
поделиться