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