作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 boost 图形库广度优先搜索来返回从节点 1 开始时访问的顶点队列。我阅读了文档,但仍然无法理解如何实现这一点。
下面的结果将按顺序返回一个队列:1,2,3,4 或 1,3,2,4
typedef boost::property<boost::edge_weight_t, unsigned int> EdgeWeightProperty;
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS,
boost::no_property, EdgeWeightProperty> Graph;
//create graph and add edge
Graph g;
boost::add_edge(1,2,6,g);
boost::add_edge(2,3,6,g);
boost::add_edge(3,1,6,g);
boost::add_edge(3,4,6,g);
//Perform breadth first using boost and return result in a queue.
最佳答案
boost 图形库文档定义了一个 BFS Visitor concept哪个国家
Users can define a class with the BFS Visitor interface and pass an object of the class to
breadth_first_search()
, thereby augmenting the actions taken during the graph search.
bfs.cpp
example完成您所要求的首选方法是对
boost::visitor
进行子类化或
boost::default_bfs_visitor
并覆盖一个或几个
initialize_vertex
discover_vertex
examine_vertex
examine_edge
tree_edge
non_tree_edge
gray_target
black_target
finish_vertex
boost::default_bfs_visitor
并覆盖
discover_vertex
:
discover_vertex(s, g)
Invoked when a vertex is encountered for the first time.
s
is An object of typeboost::graph_traits<Graph>::vertex_descriptor
andg
is an object of typeGraph
.
下面是一个具体如何做到这一点的例子,适当处理std::queue
记录顶点的对象。
#include <queue>
#include <iostream>
#include <boost/graph/visitors.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/breadth_first_search.hpp>
typedef boost::property<boost::edge_weight_t, unsigned int> EdgeWeightProperty;
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS,
boost::no_property, EdgeWeightProperty> Graph;
class BFSVisitor : public boost::default_bfs_visitor {
public:
BFSVisitor(std::queue<Graph::vertex_descriptor>& _visited) : visited(_visited){}
void discover_vertex(Graph::vertex_descriptor s, const Graph &g) { visited.push(s); }
std::queue<Graph::vertex_descriptor>& visited;
};
int main() {
Graph g;
boost::add_edge(0,1,6,g);
boost::add_edge(1,2,6,g);
boost::add_edge(2,3,6,g);
boost::add_edge(3,1,6,g);
boost::add_edge(3,4,6,g);
Graph::vertex_descriptor s = *(boost::vertices(g).first);
std::queue<Graph::vertex_descriptor> q;
BFSVisitor vis(q);
boost::breadth_first_search(g, s, boost::visitor(vis));
while (!vis.visited.empty()) {
std::cout << vis.visited.front() << std::endl;
vis.visited.pop();
}
}
这将输出
0
1
2
3
4
备注 — Boost 期望图从顶点0
开始,不是1
- 因此这条线
boost::add_edge(0,1,6,g);
如果你从顶点开始1
不会有输出。
关于c++ - 如何使用boost图形库广度优先搜索创建遍历顶点队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59331950/
我是一名优秀的程序员,十分优秀!