当前位置: 首页 > 知识库问答 >
问题:

用广度优先搜索法寻找最短路径节点

安坚诚
2023-03-14

我正在上面的图上运行广度优先搜索,查找从节点0节点6的最短路径。

我的代码

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 ALGO通过的节点。遍历以到达节点6,如[0,3,2,5,6]。为此,我创建了一个名为ShortestPath的列表&试图存储访问节点的前一个节点,以获得节点列表。转介

共有1个答案

南宫博简
2023-03-14

将所有访问的节点存储在一个列表中无助于找到最短路径,因为最终您无法知道哪些节点是通向目标节点的节点,哪些节点是死胡同。

您需要做的是每个节点将前一个节点存储在起始节点的路径中。

因此,创建一个映射map parentnodes ,而不是这样:

shortestPath.add(nextNode);
parentNodes.put(unvisitedNode, nextNode);
if(shortestPathFound) {
    List<Integer> shortestPath = new ArrayList<>();
    Integer node = nodeToBeFound;
    while(node != null) {
        shortestPath.add(node)
        node = parentNodes.get(node);
    }
    Collections.reverse(shortestPath);
}
 类似资料:
  • 问题内容: 我正在上图上进行广度优先搜索,以找到从到的最短路径。 我的密码 我需要跟踪BFS算法所经过的节点。遍历以到达节点6,例如。为此,我创建了一个名为&的列表,并尝试存储所访问节点的先前节点,以获取节点列表。被推荐 但这似乎不起作用。最短的路径是 在列表中我得到的是 这是部分正确的,但可以提供额外的收益。 If I again start from the first element of

  • 首先感谢大家看这个问题。 对于学校作业,我们应该创建一个BFS算法,并用它来做各种事情。其中一件事是,我们应该找到图的根节点和目标节点之间的所有路径。我不知道如何做到这一点,因为我找不到一种方法来跟踪所有备用路线,同时不包括副本/周期。 这是我的BFS代码: 如果能在概念上朝着正确的方向推进,将会受到极大的赞赏。 tl;dr 如何使用 BFS 查找两个节点之间的所有路径? 这是图表,因为我不知道如

  • 主要内容:src/runoob/graph/ShortestPath.java 文件代码:广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问过,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。 我们可以分为三个步骤: (1)使用一个辅助队列 q,首先将顶点 v 入队,将其标记为已访问,然后循环检测队列是否为空。 (2)如果队列不为空

  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 我有一棵树。此树中的所有节点都有一些真/假值、一个元素和父/子指针。此树中的一个元素的true/false值设置为true。我想找到从根到这个唯一节点的路径(元素序列)。如果我的树是这样的: 特殊节点是H,我的算法将返回字符串“ACEGH”。我已经使用DFS实现了这一点。但是,我当前的算法是从错误路径添加节点元素。因此,我当前的算法将返回:“ABDCEFGHI”。

  • 我正在研究BFS算法,我有一个关于如何将相邻节点插入队列的问题。 例如,假设我们正在处理一个无向图,我们希望执行BFS来输出图的内容,那么我们如何知道在从队列中取出一个初始节点后,相邻节点以什么顺序插入到队列中呢?还有,有没有办法修改邻居节点插入队列的方式? 任何帮助都将不胜感激,谢谢。