如何遍历一个图分支,从特定的节点与Boost.Graph
How to traverse an graph branch, from specific node with Boost.Graph?
将感激您的帮助。
我有一个树状结构,想要按照出现的顺序打印节点,就层次结构而言。
例如,我想遍历N1的所有子元素:
[N0, N1[N2, N3, N4[N5], N6]
我希望得到
N1 N2 N3 N4 N5
但是我收到了一些不同的东西,使用这个代码片段:
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor MyVertex;
class MyVisitor : public boost::default_dfs_visitor
{
public:
void discover_vertex(MyVertex v, const MyGraph& g) const
{
cerr << v << endl;
return;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MyGraph g;
boost::add_edge(0, 1, g);
boost::add_edge(0, 2, g);
boost::add_edge(0, 3, g);
boost::add_edge(2, 4, g);
MyVisitor vis;
//2 - N2 node
boost::depth_first_search(g, boost::visitor(vis).root_vertex(2) );
return 0;
}
输出为:
2
0
1
3
4
但我希望(2和所有的孩子)
2
4
请帮助。
谢谢。
你的图是无向的,这意味着后缘(0,2)也被取走了。
尝试将undirectedS
更改为directedS
为了避免报告从其他根中发现的顶点,您可以调整访问者以检测第一个root
是done
:
Live On Coliru
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/visitors.hpp>
#include <iterator>
using Graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS>;
using VertexPair = std::pair<Graph::vertex_descriptor, Graph::vertex_descriptor>;
struct Visitor : boost::default_dfs_visitor {
using V = Graph::vertex_descriptor;
void discover_vertex(V v, const Graph& /*g*/) {
if (!root) {
root = v;
}
if (!done) std::cerr << v << "n";
}
void finish_vertex(V v, const Graph& /*g*/) {
done |= (root == v);
}
private:
bool done = false;
boost::optional<V> root;
};
int main() {
// [N0, N1[N2, N3, N4[N5], N6] :
// VertexPair const data[] { {1, 2}, {1, 3}, {1, 4}, {4, 5}, };
VertexPair const data[] { {0, 1}, {0, 2}, {0, 3}, {2, 4}, };
Graph g(std::begin(data), std::end(data), 7);
boost::depth_first_search(g, boost::visitor(Visitor()).root_vertex(2));
//boost::write_graphviz(std::cout, g);
}
打印
2
4
如果为了效率,你想避免遍历树的其余部分,你可以使用depht_first_visit
,它可以取TerminatorFunc
。这里我将它添加到同一个访问者:
Live On Coliru
// in Visitor:
// the TerminatorFunc
bool operator()(V, Graph const&) const { return done; }
// later:
Visitor vis_termfuc; // combines visitor and terminator functions
std::vector<boost::default_color_type> colormap(num_vertices(g));
boost::depth_first_visit(g, 2, vis_termfuc, colormap.data(), vis_termfuc);
相关文章:
- Boost Graph Library,修复节点大小
- 有没有办法访问C++ Boost rtree 中的非叶节点
- Boost::p tree - 访问列表中包含的属性树节点
- 使用boost::property_tree编写CDATA XML节点
- 如何使用 Boost 为图形的节点着色
- 使用可移动节点创建有向图(使用 QT / Boost)
- 找到从节点到离它最远的节点的距离 BOOST
- 使用 boost::asio 和 std::wstring 解析网络节点
- Boost XML - 获取下一个节点
- 如何在boost::邻接列表中排列节点
- c++ Boost属性树通过属性限定符更新现有节点
- 结合二元算子AST节点的Boost Spirit Qi语法
- boost ptree:添加更多具有相同名称和属性的节点
- Boost属性树:移除嵌套节点
- Boost属性树xml解析没有这样的节点()
- 如何确定'std::map'创建的用于'boost::pool_allocator'的节点的大小(以跨平台方式)?
- 从 boost::labeled_graph 获取节点标签
- 使用 boost::variant 遍历树节点的模板
- 我如何使用json解析器的boost property_tree创建空数组节点
- 如何遍历一个图分支,从特定的节点与Boost.Graph