我運行廣度優先搜索的上圖找到Node 6
從Node 0
的最短路徑。
我的代碼
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算法中。遍歷到達節點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
。
如果我再次從shortestPath
列表的第一個元素0
開始&開始遍歷&回溯。像1
沒有優勢3
,所以我回去&從0
移到3
到5
,我會得到答案,但不知道如果這是正確的方式。
獲得最短路徑節點的理想方式是什麼?
查看第二個答案在這裏:http://stackoverflow.com/questions/8379785/how-does-a-breadth-first-search-work-when-looking-for-shortest-path?noredirect=1&lq=1 –
第二個答案解釋瞭如何在加權圖上運行BFS – underdog
它說:所有邊具有相同的權重或沒有權重。你可以假設你所有的邊都有相同的重量 –