代码之家  ›  专栏  ›  技术社区  ›  井上由一

为什么不能在BGL中的访问者内更改边缘属性?

  •  1
  • 井上由一  · 技术社区  · 7 年前

    我想在检查边时更改边权重,但它告诉我

    error: assignment of member ‘EdgeProperty::weight’ in read-only object g[e].weight = 1/g[e].residual_capacity;
    

    是否有方法更改自定义访问者函数中的边缘属性?谢谢

    struct EdgeProperty{
    float weight;
    float capacity;
    float residual_capacity;
    };
    class custom_dijkstra_visitor : public boost::default_dijkstra_visitor
    {
    public:
        template < typename Edge, typename Graph >
        void examine_edge(Edge e, Graph const & g)
        {
            g[e].weight = 1/g[e].residual_capacity;
        }
    };
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   sehe    7 年前

    最后,我通过在访问者中存储一个图形指针来解决这个问题。

    请注意,您可能会将访问者传递给一个算法。该算法有自己的不变量。如果更改重量,例如。 dijkstra_shortest_paths 可能根本不会终止,或产生不正确(次优)的结果。

    如果要根据先前算法和 使用 (取决于)权重,最安全的做法是将“更新的”权重存储在单独的地图中,然后应用更改。

        2
  •  1
  •   井上由一    7 年前

    最后,我通过存储 Graph 访问者中的指针。

    class custom_dijkstra_visitor : public boost::default_dijkstra_visitor
    {
    public:
        template < typename Edge, typename Graph >
        void examine_edge(Edge e, Graph & g)
        {
            (*gg)[e].weight = 1/(*gg)[e].residual_capacity;
        }
        Graph* gg = nullptr;
    };