使用带有捆绑属性的boost :: graph。我希望能够使用各种不同的可能边缘加权方案来运行搜索。如果可能的话,我不想为捆绑属性创建一个额外的类,并根据搜索类型传递不同的权重贴图,而无需创建新图或修改图中的所有现有属性。
我可以手动为edge_weight_t构建property_map吗?这是我到目前为止所得到的:
typedef boost::property_map<SSPSGraph_t, boost::edge_weight_t>::type WeightMap;
typedef boost::property<boost::edge_weight_t, float> DistanceProperty;
我希望能够做到
WeightMap distances;
edge_descriptor_t e = some_edge_or_another;
float d=some_derived_distance_value;
并将距离[e]指定为适当的值 -
distances[e]= ?
或者我只是需要分解并为捆绑属性构建一个新结构 - 我一直在努力避免 - 并从中创建权重图? boost :: graph的新功能;不要以为我在这里做的事情并不完全愚蠢。
答案 0 :(得分:2)
我不确定我理解你的问题。以下是一些可能对您有所帮助的提示:
你用来定义WeightMap的boost :: property_map要求你在图形中添加相应的属性(你只需要定义DistanceProperty所需的一半):
typedef boost::property<boost::edge_weight_t, float> DistanceProperty;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirS, boost::no_property, DistanceProperty> MyGraph;
如果还没有这样做,那么boost :: property_map无论如何也无法帮助你。
如果您不想为要尝试的每个不同方案添加不同的权重属性,则可以选择在图形定义之外定义此类属性。这可以做到 - 使用std :: map和boost::associative_property(这很简单,但具有地图的效率) - 使用更有效的boost::vector_property_map(感谢底层的std :: vector),但需要一个标识符property_map,即property_map,它可以从提供的边缘提取数字标识符(理想情况下介于0和num_edges() - 1之间)。此property_map通常在图中定义。
如果我的回答对您没有帮助(或者说不够),请在您的问题中更准确一些,以便我可以更新我的答案!