具有BFS的ShortestPath(BreadthFirstSearch)

时间:2017-11-04 06:42:44

标签: java shortest-path breadth-first-search

我试图返回图形的两个顶点之间的最短路径。我编写了一个代码来查找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);
        }

    }       

}

那么如何修改它以返回最短路径。

1 个答案:

答案 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);
    }
}