たくさんのノードやエッジなどを含むGraphクラスがあり、ダイクストラのアルゴリズムを実行しようとしています。まず、すべてのノードを優先キューに追加します。各ノードには、すでに「既知」であるかどうかを示すブールフラグ、その前にあるノードへの参照、およびソースノードからの長さを格納するintdistフィールドがあります。すべてのノードをPQに追加し、ソースノードに適切にフラグを付けた後、最初に間違ったノードがPQから削除されていることに気付きました。distフィールドが最小のノードが最初にオフになるはずです(ソースを除いてすべて非常に高い数に初期化されるため、PQから外れる最初のノードがソースになるはずです...一部のノードではない場合を除きます)理由)。以下は、アルゴリズムのコードと、それに続くNodeクラス内のcompareメソッドです。
public void dijkstra() throws IOException {
buildGraph_u();
PriorityQueue<Node> pq = new PriorityQueue<>(200, new Node());
for (int y = 0; y < input.size(); y++) {
Node v = input.get(array.get(y));
v.dist = 99999;
v.known = false;
v.prnode = null;
pq.add(v);
}
source.dist = 0;
source.known = true;
source.prnode = null;
int c=1;
while(c != input.size()) {
Node v = pq.remove();
//System.out.println(v.name);
//^ Prints a node that isn't the source
v.known = true;
c++;
List<Edge> listOfEdges = getAdjacent(v);
for (int x = 0; x < listOfEdges.size(); x++) {
Edge edge = listOfEdges.get(x);
Node w = edge.to;
if (!w.known) {
int cvw = edge.weight;
if (v.dist + cvw < w.dist) {
w.dist = v.dist + cvw;
w.prnode = v;
}
}
}
}
}
public int compare (Node d1, Node d2) {
int dist1 = d1.dist;
int dist2 = d2.dist;
if (dist1 > dist2)
return 1;
else if (dist1 < dist2)
return -1;
else
return 0;
}
誰かが私のPQの問題を見つけるのを手伝ってもらえますか?