广度优先搜索错误

时间:2015-09-21 08:56:10

标签: java runtime-error directed-graph breadth-first-search

digraph matrix

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;
    }

我试图去&#39; x&#39;计算到目的地的路径数量时的深度等级。

出于某种原因,我一直收到错误:

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时,它不起作用。

1 个答案:

答案 0 :(得分:2)

更改

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

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

每个图形都有一些最大深度。看来,你设置的maxDepth大于它给定图形的真正可能性,你的循环尝试继续 bfsing ,即使在处理了所有可能的节点之后(即当队列为空时)

<强>更新 我会尝试回答你在评论中发表的第二个问题,即使给定的信息实际上是不够的,所以,我会尝试将其删除=) 我想,您将计算length=1 length=2.. length=givenMaxDepth|maxPossibleDepth的所有路径。我看到了queue数据结构,但我没有看到声明 - 你是否为所有函数调用使用相同的队列?如果是,则应在每次调用后清除队列(在返回语句之前调用queue.clear()的最佳位置)。

另外,我发现你在每次通话中都使用了新的访问过的阵列,这是正确的,但如果你真的使用了一些全球访问过的话,那么你也应该清楚&#34;清除&#34;每次通话后都会访问 - 换句话说,填写错误。