【问题标题】:How to do backtracking in BFS in Java如何在 Java 中的 BFS 中进行回溯
【发布时间】:2021-12-11 13:01:06
【问题描述】:

我正在尝试用Java编写一些BFS算法并读取online,我们应该维护类似数组prev的东西,其中prev[i] = j表示我们在i之前访问的节点是节点j

所以假设我有这样一个数组。如何恢复原始路径?我可以查看任何示例代码吗?我并没有真正得到解决方案中的解释,它似乎只是掩盖了“回到”源头的步骤。

【问题讨论】:

  • 你只是反向跟随父/前指针。所以你从目的地循环回来,总是查找prev 条目,直到你再次到达源。在这样做的同时收集节点,你就有了自己的路径。

标签: java breadth-first-search backtracking


【解决方案1】:

我的理解是你在 BFS 之后填充了一个父数组。 父数组保存节点的父 id,换句话说,就是在当前节点之前访问的节点。拥有数组后,您可以像这样打印路径:

void printPath(int[] parent, int i) {
    if(parent[i] == -1) {//Root node does not have a parent 
         return;
    } else {
        printPath(parent, parent[i]);
        System.out.println(i);
    }
}

请注意,仅当您使用整数 0 ... |V| 标记/标识图中的节点时,此表示才有效。另一种常见的表示是地图(或字典)。

Map<Node, Node> parentTree

【讨论】:

    【解决方案2】:

    广度优先搜索通常需要一个具有 FIFO 顺序的队列。

    这里有一些示例代码供您使用:

    class Node<T> {
        Node<T> left;
        Node<T> right;
        T data;
    }
    
    public static void Main(String[] args) {
       Node<String> root; // assume this is initialized with plenty of children
       
       Queue<Node<String>> bfs_queue(root);
    
       while(!bfs_queue.empty()) {
           Node target = bfs_queue.get();
           if(target == null) continue;
           
           // Do something with the data
           System.out.println(target.data)
    
           bfs_queue.push(target.left);
           bfs_queue.push(target.right);
       }
    }
    

    如您所见,我们使用队列为我们提供第一个进入的项目,而对于我们在当前关卡的整个宽度中提取的每个项目,我们不断添加 target 子节点以准备搜索下一个级别。

    (请注意上面的代码是伪 Java 代码,但足够接近)

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 2011-02-12
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多