ウィキペディアのページの疑似コードからダイクストラのアルゴリズムを実装しようとしました。キューがポーリングされた後に、現在のノードがターゲット ノードであるかどうかをテストする条件を設定しました。その場合、アルゴリズムは a から b へのパスを中断して戻すことになります。
Adjacency Matrix の範囲内のすべてのノードが実際に存在することがわかっているため、この条件は常に満たされます。プログラムは、ロンドン地下鉄マップの接続をモデル化することです。
とにかく、私はしばらくの間これを理解しようとしてきましたが、これまでのところ私にはわかりません. 多分誰かが問題を見つけることができます。ああ、adj
私のグラフの隣接行列です。
/**
Implementation of Dijkstra's Algorithm taken from "Introduction to
Algorithms" by Cormen, Leiserson, Rivest and Stein. Third edition.
d = Array of all distances.
pi = Previous vertices.
S = Set of vertices whose final shortest path weights have been
determined.
Q = Priority queue of vertices.
**/
public ArrayList<Integer> dijkstra(Integer a, Integer b){
final double[] d = new double[adj.length];
int[] pi = new int[adj.length];
HashSet<Integer> S = new HashSet<Integer>();
PriorityQueue<Integer> Q = new PriorityQueue<Integer>(d.length, new Comparator<Integer>(){
public int compare(Integer a, Integer b){
Double dblA = d[a-1];
Double dblB = d[b-1];
return dblA.compareTo(dblB);
}
});
for(int i=0; i<d.length; i++){
d[i] = Double.POSITIVE_INFINITY;
}
d[a] = 0f;
for(int i=0; i<d.length; i++){
Q.add(i+1);
}
while(Q.size() > 0){
int u = Q.poll();
if(u == b){
System.out.println("jjd");
ArrayList<Integer> path = new ArrayList<Integer>();
for(int i=pi.length-1; i>=0; i--){
path.add(pi[i]);
}
return path;
}
S.add(u);
if(d[u] == Double.POSITIVE_INFINITY){
break;
}
for(int v=0; v<adj.length; v++){
double tmp = d[u] + adj[u][v];
if(tmp < d[v]){
d[v] = tmp;
pi[v] = u;
}
}
}
return new ArrayList<Integer>();
}
}
編集:- デバッグを行った後、while ループの本体が 1 回だけ実行されているようです。