Sha*_*ars 5 java algorithm directed-graph breadth-first-search adjacency-matrix
public int bfs(int maxDepth){
int src = 2;
int dest = 2;
int i;
int depth = 0;
int countPaths = 0;
int element;
queue.add(src);
while(!queue.isEmpty() && depth <= maxDepth)
{
element = queue.remove();
i = 0;
while(i < 5)
{
if(arr[element][i] > 0)
{
queue.add(i);
if(i == dest)
countPaths++;
}
i++;
}
}
queue.clear();
return countPaths;
}
Run Code Online (Sandbox Code Playgroud)
你好!!给定源和目的地,我需要找到一条路径.就遍历图表而言,我的BFS算法工作得很好.我的问题是当我想要它时停止它.我拿出了我增加深度的地方,所以我看起来不像是一个完全白痴.我希望有人能帮帮忙.基本上我想知道如何跟踪当前的深度.谢谢!
例:
找到从C到C的路径数,最多3个停靠点.答案是两条路:
C - > D - > C(2站)
C - > E - > B - > C(3站)
示例2:找到从A到C的路径数,最多3个停靠点.答案是三条路.
A - > B - > C(2站)
A - > D - > C(2站)
A - > E - > B - > C - >(3站)
问:本质上我想知道如何跟踪当前深度。
一种解决方案是创建一个带有附加字段的包装类,深度,正如 @svs 在他的回答中解释的那样。但是,有一个巧妙的技巧可以避免创建包装类,而且非常简单:
queue.add(src);
while(!queue.isEmpty())
{
int size = queue.size();
for(int i=0; i<size; i++)
{
.. //do processing for the current depth
}
}
Run Code Online (Sandbox Code Playgroud)
在循环中,for对该级别的节点执行您打算执行的任何操作,包括将新元素放入队列中(即深度等于 current_depth + 1 的节点)。在循环中仅迭代queue.size()几次for将保证您仅处理当前级别的节点,并且while循环将保证所有级别都将被处理(或者仅处理其中的一些级别,如果您扩展停止循环的条件)。