繁体   English   中英

广度优先搜索错误

[英]breadth first search error

有向图 矩阵

public int bfs(int maxDepth){ //maxDepth = 3 works.. maxDepth = 4 gives me an error
        int src = 0;
        int dest = 2;
        int nodes = arr[src].length - 1;
        boolean[] visited = new boolean[nodes + 1];
        int i;
        int countDepth = 0;
        int countPaths = 0;
        int element;


        queue.add(src);

        while(!queue.isEmpty() || countDepth != maxDepth)
        {
            element = queue.remove();
            i = element;

            while(i <= nodes)
            {
                if(arr[element][i] > 0 && visited[i] == false)
                {
                    queue.add(i);
                    visited[i] = true;

                    if(arr[i][element] > 0) //if it has two directions
                        visited[i] = false;

                    if(element ==  dest || i == dest)
                        countPaths++;
                }

                i++;
            }

            countDepth++;
        }

        return countPaths;
    }

我在尝试计算到达目的地的路径数时,尝试增加“ x”级的水平。

由于某些原因,我不断收到错误消息:

Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.removeFirst(Unknown Source)
at java.util.LinkedList.remove(Unknown Source)
at Graph.bfs(Graph.java:48)

我不明白发生了什么。 当我深入3个级别时,它似乎起作用,但是当我将其更改为4级时,它不起作用。

更改

while(!queue.isEmpty() || countDepth != maxDepth)

while(!queue.isEmpty() && countDepth != maxDepth)

每个图都有一些最大深度。 看来,您将maxDepth设置为大于给定图形的实际可能值,即使处理了所有可能的节点(例如,当队列为空时),循环也会尝试继续bfsing

更新我将尝试为您在评论中发布的第二个问题提供答案,即使给定的信息实际上还不够,因此,我将尽力做到Extrasens =)我想,您将计算length=1所有路径length=2.. length=givenMaxDepth|maxPossibleDepth 我看到了queue数据结构,但没有看到声明- 您是否对所有函数调用使用相同的队列? 如果是,则应在每次调用后清除队列 (调用queue.clear()最佳位置是在return语句之前)。

另外,我看到您在每个调用中都使用了新的访问数组,这是正确的,但是如果您实际上使用了一些全局访问,则还应在每次调用后“清除”已访问的数组,换句话说,将其填充为false。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM