Boost Graph DFS等算法API设计动机及参数疑问
通用问题
作为BGL的初学者,我难以理解为何此处的“最小惊讶原则”似乎未被遵循。
背景
我花了不少功夫构建了一个树形图,原本期望能写出如下代码:
tree.dfs(visitor);
在了解到BGL并非面向对象API后,我觉得改成如下写法是合理的:
depth_first_search(tree, visitor)
随后我又了解到BGL中没有Tree类,设计上选择将根节点作为值属性而非类型属性,这解释了为何需要传入根节点描述符,比如:
depth_first_search(graph_that_is_a_tree, visitor, root);
我的困惑
到这里我基本能理解设计思路,但实际要让代码编译运行,我却必须写出如下代码:
auto [root, tree] = my_stuff::to_k_ary_tree<my_vertex, my_edge>(ast); auto indexmap = boost::get(boost::vertex_index, tree); auto colormap = boost::make_vector_property_map<boost::default_color_type>(indexmap); MyVisitor<my_stuff::k_ary_tree<my_vertex,my_edge>> vis; std::vector<boost::default_color_type> colors(num_vertices(tree)); boost::depth_first_search(tree, vis, colormap, root);
这就是我失去直觉理解的地方:即便我知道多数算法需要颜色映射,仍无法理解为何要使用这样的签名。
我的问题
为何DFS算法不能自行处理这些细节?
我的猜想
- 是否因为tree并非独立类型?如果Tree和Graph之间没有类型区分,DFS无法知道图中无环,因此需要为所有情况标记已探索的顶点——即便我确定这是一棵有根无环的树。
- 但这仍无法完全解释为何DFS不能在后台创建、使用并销毁这个颜色映射。
内容的提问来源于stack exchange,提问作者WaterFox
相关产品推荐
相关产品推荐

