我正在上图上进行广度优先搜索,以找到从Node 0
到的最短路径Node 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算法所经过的节点。遍历以到达节点6,例如[0,3,2,5,6]
。为此,我创建了一个名为shortestPath
&的列表,并尝试存储所访问节点的先前节点,以获取节点列表。被推荐
但这似乎不起作用。最短的路径是[0,3,2,5,6]
在列表中我得到的是 Shortest path: [0, 0, 0, 0, 1, 3, 3, 2, 5]
这是部分正确的,但可以提供额外的收益1
。
If I again start from the first element 0
of the shortestPath
list & start
traversing & backtracking. Like 1
doesn’t has an edge to 3
, so I backtrack
& move from 0
to 3
to 5
, I will get the answer but not sure if that’s
the correct way.
What is the ideal way to getting the nodes for the shortest path?
将所有访问的节点存储在单个列表中对于查找
最短路径,因为最终你无法知道哪些节点是
哪些是指向目标节点的,哪些是死胡同。
您需要做的是让每个节点在路径中存储上一个节点
从起始节点开始。
因此,创建一个map map<Integer,Integer>parentNodes
,而不是这样:
shortestPath.add(nextNode);
do this:
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 ALGO通过的节点。遍历以到达节点6,如。为此,我创建了一个名为的列表&试图存储访问节点的前一个节点,以获得节点列表。转介
首先感谢大家看这个问题。 对于学校作业,我们应该创建一个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来输出图的内容,那么我们如何知道在从队列中取出一个初始节点后,相邻节点以什么顺序插入到队列中呢?还有,有没有办法修改邻居节点插入队列的方式? 任何帮助都将不胜感激,谢谢。