C++STL中的BFS图遍历
BFS graph traversal in C++ STL
我想用STL在C++中实现BFS图遍历。BFS不能正常工作。我看到每个人都使用队列来实现BFS。所以我自己尝试了一下,但肯定遗漏了什么。我的实现将重复项添加到队列中,从而多次遍历一些顶点。我应该使用集合而不是队列来消除重复项吗??
class Graph {
public:
Graph(int n): numOfVert {n}{
adjacencyLists.resize(n);
}
void addEdge(std::pair<int,int> p);
void BFS(int start);
private:
int numOfVert;
std::vector<std::list<int>> adjacencyLists;
};
void Graph::BFS(int start){
std::cout << "BFS: ";
std::vector<int> visited(numOfVert, 0);
std::queue<int> q; q.push(start);
while(!q.empty()){
int curr = q.front(); q.pop();
std::cout << curr << " ";
visited.at(curr) = 1;
for(const auto x: adjacencyLists.at(curr)){
if(visited.at(x) == 0) q.push(x);
}
}
std::cout << "n";
}
int main(){
Graph g(4);
std::set<std::pair<int,int>> E {{0,1}, {1,2}, {1,3}, {2,3}};
for(auto& x: E) g.addEdge(x);
g.print();
g.BFS(0);
}
当您在队列上推送节点时,您不再希望它有资格进行另一次推送,即只访问每个节点一次。因此,您标记了访问的每个推送元素。你可以添加一个简单的lambda来解决这个问题。
std::queue<int> q;
auto push_and_visit= [&q, &visited](int node){
q.push(node); visited[node] = 1; };
push_and_visit(start);
while(!q.empty()){
int curr = q.front(); q.pop();
std::cout << curr << " ";
for(const auto x: adjacencyLists.at(curr)){
if(visited.at(x) == 0) push_and_visit(x);
}
}
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- Node中的子节点列表在C++中的BFS遍历过程中丢失
- BFS遍历给出错误的输出
- 树木中的BFS(级别顺序遍历)
- 了解使用 BFS 进行树遍历的时间复杂度
- C++ 用于 BFS 遍历的 lambda 函数
- BFS遍历图节点两次
- C++STL中的BFS图遍历