Нахождение кратчайшего пути узлов с широтой первого поиска
Я бег широты первым поиска на графику выше, чтобы найти кратчайший путь от Node 0
к Node 6
.
Мой код
public List<Integer> shortestPathBFS(int startNode, int nodeToBeFound){
boolean shortestPathFound = false;
Queue<Integer> queue = new LinkedList<Integer>();
Set<Integer> visitedNodes = new HashSet<Integer>();
List<Integer> shortestPath = new ArrayList<Integer>();
queue.add(startNode);
shortestPath.add(startNode);
while (!queue.isEmpty()) {
int nextNode = queue.peek();
shortestPathFound = (nextNode == nodeToBeFound) ? true : false;
if(shortestPathFound)break;
visitedNodes.add(nextNode);
System.out.println(queue);
Integer unvisitedNode = this.getUnvisitedNode(nextNode, visitedNodes);
if (unvisitedNode != null) {
queue.add(unvisitedNode);
visitedNodes.add(unvisitedNode);
shortestPath.add(nextNode); //Adding the previous node of the visited node
shortestPathFound = (unvisitedNode == nodeToBeFound) ? true : false;
if(shortestPathFound)break;
} else {
queue.poll();
}
}
return shortestPath;
}
мне нужно отслеживать узлы, через которые BFS Algo. пройденный для достижения узла 6, например [0,3,2,5,6]
. Для этого я создал список с именем shortestPath
&, пытающийся сохранить предыдущие узлы посещенных узлов, чтобы получить список узлов. Referred
Но это не работает. Самый короткий путь [0,3,2,5,6]
В списке, что я получаю это Shortest path: [0, 0, 0, 0, 1, 3, 3, 2, 5]
Это отчасти верно, но дает дополнительные 1
.
Если бы я снова начать с первым элементом 0
из shortestPath
списка & начать обход & откатов. Нравится 1
не имеет края 3
, поэтому я возвращаюсь назад & переезд из 0
в 3
в 5
, я получу ответ, но не уверен, что это правильный путь.
Каков идеальный способ получить узлы для кратчайшего пути?
См. Второй ответ здесь: http://stackoverflow.com/questions/8379785/how-does-a-breadth-first-search-work-when-looking-for-shortest-path?noredirect11&lq=1 –
Второй ответ объясняет, как запустить BFS на взвешенном графике – underdog
В нем говорится: все ребра имеют одинаковый вес или нет веса. Вы можете предположить, что все ваши края имеют одинаковый вес –