ダイクストラ アルゴリズムには、「最短パスのノードを選択する」というステップがあります。このステップが であることを認識していunnecessary if we dont throw a node out of the graph/queue
ます。これは私の知る限りではうまく機能し、既知の欠点はありません。これがコードです。失敗したら教えてください。もしそうなら、どうやって?[編集 => このコードはテスト済みで、うまく機能しますが、私のテストケースが完全ではなかった可能性があるため、スタックオーバーフローに投稿しています]
public Map<Integer, Integer> findShortest(int source) {
final Map<Integer, Integer> vertexMinDistance = new HashMap<Integer, Integer>();
final Queue<Integer> queue = new LinkedList<Integer>();
queue.add(source);
vertexMinDistance.put(source, 0);
while (!queue.isEmpty()) {
source = queue.poll();
List<Edge> adjlist = graph.getAdj(source);
int sourceDistance = vertexMinDistance.get(source);
for (Edge edge : adjlist) {
int adjVertex = edge.getVertex();
if (vertexMinDistance.containsKey(adjVertex)) {
int vertexDistance = vertexMinDistance.get(adjVertex);
if (vertexDistance > (sourceDistance + edge.getDistance())) {
//previous bug
//vertexMinDistance.put(adjVertex, vertexDistance);
vertexMinDistance.put(adjVertex, sourceDistance + edge.getDistance())
}
} else {
queue.add(adjVertex);
vertexMinDistance.put(adjVertex, edge.getDistance());
}
}
}
return vertexMinDistance;
}