【问题标题】:creating boost::graph edge_weight property map创建 boost::graph edge_weight 属性映射
【发布时间】:2009-04-03 18:41:37
【问题描述】:

使用带有捆绑属性的 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 的新功能;不要假设我在这里没有做完全愚蠢的事情。

【问题讨论】:

    标签: c++ boost graph-theory boost-graph


    【解决方案1】:

    我不确定我是否理解您的问题。以下是一些可能对您有所帮助的提示:

    boost::property_map,您用来定义 WeightMap 要求您在图形中添加相应的属性(您只完成了定义 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 通常在图中定义。

    如果我的回答对您没有帮助(或不够),请在您的问题中更准确一点,以便我可以更新我的答案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 2014-03-07
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多