BFS重建路径以获得最短路径

时间:2016-09-30 23:09:34

标签: java arrays algorithm breadth-first-search

我想从广度优先搜索构建一条最短路径。我已经用Java代码实现了BFS(如下所示),但现在我不知道如何重构路径以从代码的实现中获取最短路径。

虽然我知道我必须保留一系列父母,但我不知道将它放在我的代码中。基本上,我想追溯使用BFS从起点到目标点的最短路径。请注意,我正在使用2D数组。

我做得对吗?有人可以帮帮我吗?

public ArrayList<Point> shortestPath=new ArrayList<>();
public ArrayList<Point> BFS(Point start, Point end){
   int[][] distanceBoard=new int[50][50]; Point current,parent;
    for(int i=0;i<distanceBoard.length;i++)
        for(int j=0;j<distanceBoard.length;j++) distanceBoard[i][j]=Integer.MAX_VALUE;
    distanceBoard[start.getX()][start.getY()]=0;
    LinkedList<Point> q=new LinkedList<>();
    q.addFirst(start);
    while(!q.isEmpty()){
        current=q.getFirst();
        if((new Point(current.getX(),current.getY()))==end) return shortestPath;
        q.removeFirst();
        for(Point point:current.getNeighbours()){
            if(distanceBoard[point.getX()][point.getY()]==Integer.MAX_VALUE){
                distanceBoard[point.getX()][point.getY()]=distanceBoard[current.getX()][current.getY()]+1;
                parent=current;
                q.addLast(point);
            }
            shortestPath.add(current);
        }
    }return null;
}

1 个答案:

答案 0 :(得分:0)

要回溯,你只需使用目的地点的父亲,然后继续直到你到达你开始的地方......类似

ArrayList < vertex > points = new ArrayList < > ();
while ((current.x != startx) || (current.y != starty)) {
  points.add(current);
  current = current.parent;
}

其中startxstarty是您在网格中开始的(x,y)位置。您希望在找到要查找的目的地后执行此操作,即在您突破while(!q.isEmpty()){...}之后。

while (!q.isEmpty()) {
  current = q.dequeue();
  if (current.x == targetx && current.y == targety) break; //quite when path is found
  ...
}
ArrayList < vertex > vertices = new ArrayList < > ();
while ((current.x != startx) || (current.y != starty)) {
  vertices.add(current);
  current = current.parent;
}

所以parent Point是一种记住你来自哪里的方式,所以如果你有目的地Point那么你应该有目的地Point'{ {1}}(或之前的位置),一旦您有目的地parent的{​​{1}},您就想找到目的地Point的{​​{1}} parent依此类推,直到你开始搜索Point。我也是,只是为了增加您的困惑,在parent中犯了一个错误,因此我将parent更改为Point,因为您不想停止迭代例如,你只有正确的y值,你希望它在双方都是假的时候停止,即while ((current.x != startx)...)while ((current.x != startx) && (current.y != starty))都是假的。