邻接矩阵上的BFS

BFS on Adjacency Matrix

本文关键字:BFS 邻接矩阵      更新时间:2023-10-16

>我正在尝试在无向未加权图的邻接矩阵上实现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;
}
与其在

弹出队列后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++;
        }
    }
}

有几个问题,帮助我们磨练答案。但是,请分享有关您返回的计数的更多详细信息。以下是需要注意的事项:

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