邻接矩阵的广度优先算法:搜索过早结束,返回大小为1的队列?

时间:2015-07-06 17:32:52

标签: java algorithm graph breadth-first-search adjacency-matrix

adj是一个邻接矩阵:

0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 
1 0 0 0 1 0 1 0 0 
0 0 0 1 0 1 0 0 0 
0 0 1 0 1 0 0 0 1 
0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 

adj映射下方迷宫的邻接(侧面是元素#):

S X E | 0 1 2
O O O | 3 4 5
O X O | 6 7 8

我正在使用邻接矩阵来遍历迷宫中的元素。这是一个遍历矩阵的广度优先搜索算法。

queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private queue BFS(int[][] adj, int begin) {
    visited[begin] = true;
    Q.enqueue(begin);
    while (!Q.isEmpty()) {
        int element = Q.dequeue();
        int temp = element;
        while (temp <= num) {
            if ((!visited[temp]) && (adj[element][temp] == 1)) {
                if (temp == end) {
                    return Q;
                }
                Q.enqueue(temp);
                visited[temp] = true;
            }
            temp++;
        }
    }
    return Q;
}

执行BFS()会返回size() 1的队列。具体来说,队列只包含begin(在本例中为0)。该算法应生成[0, 3, 4, 5, 2]的队列。在第一个System.out.println("blah")开头后立即插入while()表明它只迭代一次。

为什么我的算法过早停止?如何调整它以获得我想要的输出?我的目标是设置一个算法,在这种情况下找到“0”和“2”之间可能的最短路径。

1 个答案:

答案 0 :(得分:2)

你在第一次迭代时遇到条件temp == end因为你的temp从0开始,然后它是1而没有插入元素到队列(因为它不与0相邻),那么它是2而没有插入,而你在这里在条件temp == end(均等于2)下,如果尚未插入任何内容,则返回仅包含begin的Q.所以你只有一次外循环迭代和三次内循环迭代。

我建议进行以下修改

queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private void BFS(int[][] adj, int begin) {
    visited[begin] = true;
    Q.enqueue(begin);
    while (!Q.isEmpty()) {
        int element = Q.dequeue();
        if (element == end) {
            return Q;
        }
        int temp = 0;
        while (temp < num) {
            if ((!visited[temp]) && (adj[element][temp] == 1)) {
                Q.enqueue(temp);
                visited[temp] = true;
            }
            temp++;
        }
    }
    return Q;
}