邻接矩阵的BFS

时间:2016-04-27 19:28:14

标签: c++ breadth-first-search

我正在尝试在无向未加权图的邻接矩阵上实现BFS,该矩阵返回所访问的节点数。到目前为止,我已经想到了这个,但我认为这是不对的,因为当我打印出顶部/访问过的节点时,我会多次出现一些节点,而且它没有排序。我在某处看过BFS是一个拓扑排序,我获得的顺序没有排序。

int BFS(std::vector<std::vector<int> > &matrix, int start)
{
    std::vector<bool> visited(matrix.size(), false);
    std::queue<int> Q;
    Q.push(start);
    int count = 0;

    while( ! Q.empty())
    {
        int top = Q.front(); Q.pop();
        visited[top] = true; count++;
        for (int i = 0; i < matrix.size(); ++i)
        {
            if(matrix[top][i] != 0 && (! visited[i]) )
            {
                Q.push(i);
            }
        }
    }
    return count;
}

2 个答案:

答案 0 :(得分:2)

在弹出队列后,不应将visited节点设置为true,而应在将其插入队列时进行设置,并在内部添加计数,以防止对某些节点进行重复计数。请参阅以下内容:

//..previous lines

Q.push(start);
visited[start] = true;
int count = 1;

while(!Q.empty()){
    int top = Q.front(); Q.pop();

    for (int i = 0; i < matrix.size(); ++i){
        if(matrix[top][i] != 0 && (! visited[i]) ){
            Q.push(i);
            visited[i] = true;
            count++;
        }
    }
}

答案 1 :(得分:0)

有几个问题,帮助我们磨练答案。但是,请分享您回来的计数的更多细节。以下是要查看的内容:

  • 为什么要增加for循环内的计数?您可能多次计算一个节点。
  • 已访问的大小不足以容纳所有节点。在std::vector<bool> visited(matrix.size(), false);中,matrix.size()仅返回外部向量的大小。这意味着 Visited 中最多可获得一行数据。
  • 用于访问的数据结构存在问题。要么使用矢量&gt;或者在一个序列中具有n * n个元素的线性化矢量。如果您最终使用简单向量,则需要在 Visited 中查找索引时将[i] [j]索引映射到某个位置。这是一个主要问题,您无法正确跟踪节点。
  • BFS不保证排序顺序。请构建一个简单的反例来说服自己。可以使用BFS(或DFS)执行拓扑排序。