我试图返回图形的两个顶点之间的最短路径。我编写了一个代码来查找breadthFirstSearch,但我不知道如何修改它以使其返回最短路径。下面是我的breadthFirstSearch函数
private void breadthFirstSearch(T start,T end){
Queue<T> queue = new LinkedList<>();
Set<T> visited = new HashSet<>();
visited.add(start);
queue.add(start);
while(!queue.isEmpty()){
T v = queue.poll();
for(int i =0;i<this.keyToVertex.get(v).successors.size();i++){ if(visited.contains(this.keyToVertex.get(v).successors.get(i).key)){
continue;
}
visited.add(this.keyToVertex.get(v).successors.get(i).key);
queue.add(this.keyToVertex.get(v).successors.get(i).key);
}
}
}
那么如何修改它以返回最短路径。
答案 0 :(得分:1)
您需要跟踪Queue
不只是要检查的值,而是跟踪导致该值的路径。因此,类型不仅仅是Queue<T>
,而是Queue<LinkedList<T>>
。
队列中的第一个值应该是start
的单例列表,而不仅仅是start
。
在处理队列中的值时,您访问的顶点将是队列项的最后一个元素,当您向队列添加项时,它应该是当前项的克隆,下一个邻居补充道。
这样的事情:
Queue<LinkedList<T>> queue = new LinkedList<>();
queue.add(new LinkedList<>(Collections.singleton(start)));
while (!queue.isEmpty()) {
LinkedList<T> path = queue.poll();
T v = path.getLast();
if (v.equals(end)) {
return path;
}
for (int i = 0; i < this.keyToVertex.get(v).successors.size(); i++) {
T v2 = this.keyToVertex.get(v).successors.get(i).key;
if (visited.contains(v2)) {
continue;
}
LinkedList<T> path2 = new LinkedList<>(path);
path2.add(v2);
queue.add(path2);
visited.add(v2);
}
}