为什么BGL中的访问者无法更改边缘属性?

时间:2018-01-17 14:32:19

标签: c++ boost graph boost-graph

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

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 个答案:

答案 0 :(得分:2)

  

最后,我通过在访问者中存储一个Graph指针来解决它。

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

如果你想根据以前算法的结果改变权重,算法使用(取决于)权重,最安全的做法是存储“更新的”权重在一个单独的地图中,然后应用更改。

答案 1 :(得分:1)

最后,我通过在访问者中存储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;
};