我正在尝试在无向未加权图的邻接矩阵上实现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;
}
答案 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)
有几个问题,帮助我们磨练答案。但是,请分享您回来的计数的更多细节。以下是要查看的内容:
std::vector<bool> visited(matrix.size(), false);
中,matrix.size()仅返回外部向量的大小。这意味着 Visited 中最多可获得一行数据。