Я знаю, что заголовок немного сумбурный, но я не знаю, как его лучше объяснить.
Что я пытаюсь сделать:
Используя граф, найденный в текстовом файле, найдите и распечатайте кратчайший путь (минимальное количество вершин) из вершины A в вершину B.
Примечание: использование поиска в ширину, а не Дейкстры.
Что у меня есть:
Рабочий алгоритм, применяющий BFS к графу, но не способ распечатать кратчайший путь.
Мне трудно отличить вершину кратчайшего пути от вершины, которая просто проходит через алгоритм, но не в кратчайшем пути.
Например: Найдите кратчайший путь между 0 и 4. 0 соединяется с 1,2 и 3. 1 соединяется с 4. Мой путь оказывается [0,1,2,3,4] вместо [0,1, 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 = целевая вершина
г = график
vi = обычный итератор, который выполняет итерацию по соседям v
Спасибо, что прочитали!
String
в Java не являются неизменяемыми? Какая польза от измененияpath
вrunBFS
? - person thkala   schedule 28.03.2011