邻接矩阵上的BFS
BFS on Adjacency Matrix
>我正在尝试在无向未加权图的邻接矩阵上实现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)执行。
相关文章:
- 如何在C++中为表面制作邻接矩阵
- 在 c++ 中初始化邻接矩阵
- 有关邻接矩阵实现的问题
- MFC:在编辑框中表示邻接矩阵
- C++中有向无环图的邻接列表到邻接矩阵的转换
- 我需要将阵列样式的邻接矩阵转换为矢量样式(以使其看起来更好)
- 如何正确接受平方加权邻接矩阵
- 创建随机邻接矩阵,每个节点具有最小'k'度
- 如何在C++中将边列表转换为邻接矩阵,其中包含连接到顶点的边数而不是一条边?
- 确定邻接矩阵是否具有周期,然后输出该周期
- 邻接矩阵构建功能用一些图崩溃
- 使用邻接矩阵获取给定节点的所有边缘
- 对邻接矩阵最大循环中的节点进行计数
- 图实现,使用邻接矩阵,在链接中带有自定义数据
- 在C++中向邻接矩阵的边添加代价
- 邻接矩阵上的BFS
- 查找路径的有向图邻接矩阵
- 如何在c++中使用模板图类中的向量创建邻接矩阵
- Dijksta算法在邻接矩阵中找不到路径
- 为 BFS 创建邻接矩阵