【问题标题】:BFS on Adjacency Matrix邻接矩阵上的 BFS
【发布时间】:2016-04-27 19:28:13
【问题描述】:

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

【问题讨论】:

  • 你为什么不觉得是对的?
  • 我只是在编辑问题以添加它,而你却投了反对票。
  • 我没有投反对票。 :)

标签: c++ breadth-first-search


【解决方案1】:

在弹出队列后不要将visited节点设置为true,你应该在插入队列时设置它,并在里面添加count,以防止某些节点重复计数。请参考以下内容:

//..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++;
        }
    }
}

【讨论】:

  • 我也通过hit and trial得到了答案,但基本上for循环是为了添加访问节点的所有邻居,对吧?如果我们在从队列中删除时访问它,或者我应该在执行 if 时添加(不在队列中),这不一样吗?
  • 不,不一样。例如:假设你有 (1)->(2)、(3) 和 (2)->(3)。如果在出队列的时候count++,则(3)节点被计算两次。
【解决方案2】:

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

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

【讨论】:

  • 这个计数是错误的,因为我在尝试不同的变化后忘记删除它。我现在已经编辑并删除了它。我相信,如果图有 n 个节点,则访问的数组可以保存所有节点,因为邻接矩阵将为 n*n。因此,visited 可以处理所有节点。好的,它可能不会总是执行排序,但它不应该多次访问同一个节点。我在visited[top] = true 之后为top 添加了一个打印语句,发现重复的节点我认为在BFS 中不会发生。
  • 您遗漏了一个关键点:在visited 的声明中,您将大小指定为matrix.size()。但是,矩阵是向量的向量。当您说矩阵 size() 时,您会得到外部向量的大小。但是,visited 可能需要包含所有元素。
  • 但是元素的数量=外部矩阵的大小,因为它是一个邻接矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多