我想在检查边缘时更改边缘权重,但它会告诉
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;
}
};
答案 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;
};