タイトルが少し乱雑であることは知っていますが、それをよりよく説明する方法がわかりません。
私がやろうとしていること:
テキストファイルで見つかったグラフを使用して、頂点Aから頂点Bまでの最短経路(頂点の最小量)を見つけて印刷します。
注:ダイクストラ法ではなく、幅優先探索を使用します。
私が持っているもの:
グラフにBFSを適用する実用的なアルゴリズムですが、実際に最短経路を印刷する良い方法はありません。
最短経路の頂点と、アルゴリズムを介して実行されるが最短経路ではない頂点を区別するのに苦労しています。
例:0と4の間の最短パスを見つけます。0は1,2と3に接続します。1は4に接続します。私のパスは[0,1、1ではなく[0,1,2,3,4]になります。 4]。
同じ質問をしているスレッドや、これを含むBFSのウォークスルーを見つけることができなかったので、これを実際よりもはるかに難しくしているのかどうかわかりません。
編集:興味があるかもしれない人のためのコード(私がサークルを避けているかどうかはまったくわかりませんか?)
編集2:スタックへのパスを保存する方法を変更しました。
public String findPath(int v, int w) {
Queue<Integer> q = new LinkedList<Integer>();
boolean[] visited = new boolean[g.numVertices()];
q.add(v);
Stack<Integer> path = new Stack<Integer>();
while(q.peek() != null) {
runBFS(q.poll(),w,visited,q,path);
}
return path.toString();
}
private void runBFS(int v, int w, boolean[] visited, Queue<Integer> q, Stack<Integer> path) {
if(visited[v]) {
}
else if(v == w) {
path.add(v);
q.clear();
}
else {
path.add(v);
visited[v] = true;
VertexIterator vi = g.adjacentVertices(v);
while(vi.hasNext()) {
q.add(vi.next());
}
}
}
変数とメソッドの説明:
v=原点
w=ターゲット頂点
g=グラフ
vi=vの近傍を反復処理する通常の反復子
読んでくれてありがとう!