Надеюсь, это помогло.

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

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

Ответы на вопрос(6)

Ваш ответ на вопрос