我需要为给定的图形创建一个支配树。我编译并运行的代码没有错误,但输出看起来与输入完全相同。
我为我的图表(待分析)定义了以下类型
typedef boost::adjacency_list<boost::listS, boost::vecS,
boost::bidirectionalS, vertex_info, edge_info> Graph;
我希望有另一个对象包含相应的支配树。我尝试了以下方法:
// dominator tree is an empty Graph object
dominator_tree = trace;
typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
typedef typename boost::property_map<Graph, boost::vertex_index_t>::type IndexMap;
typedef typename boost::iterator_property_map<typename std::vector<Vertex>::iterator, IndexMap> PredMap;
IndexMap indexMap(get(boost::vertex_index, dominator_tree));
std::vector<Vertex> domTreePredVector = std::vector<Vertex>(
num_vertices(dominator_tree),
boost::graph_traits<Graph>::null_vertex());
PredMap domTreePredMap = make_iterator_property_map(
domTreePredVector.begin(), indexMap);
lengauer_tarjan_dominator_tree(dominator_tree, vertex(0, dominator_tree),
domTreePredMap);
当我将dominator_tree的内容输出到.dot文件时,它与trace中的内容完全相同。即看起来上面最后一行的调用没有改变任何东西。输入图如下所示: http://s24.postimg.org/y17l17v5x/image.png
INIT节点是节点0.如果我选择任何其他节点作为函数的第二个参数,它仍然会返回相同的结果。
我做错了什么? Apreciate任何帮助。
答案 0 :(得分:2)
看一下文档(http://www.boost.org/doc/libs/1_40_0/libs/graph/doc/lengauer_tarjan_dominator.htm),我看到第一个参数标记为IN。
这意味着这只是一个输入参数。所以你不应该期望它被改变!
THIRD参数标记为OUT。所以这是在通话后会改变的价值。根据文件:
OUT:DomTreePredMap domTreePredMap父母的支配树 是每个孩子的直接支配者。
因此,如果您希望更改图形,则必须自己执行:删除所有现有边,然后遍历树,根据树的指定向图中添加边。