[英]Why edge properties can't be changed within visitor in BGL?
我想在檢查邊緣時改變邊緣重量,但它告訴我
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;
}
};
最后,我通過在訪問者中存儲Graph指針來解決它。
請注意,盡管您可能會將訪問者傳遞給算法。 該算法有自己的不變量。 如果更改權重,例如dijkstra_shortest_paths
可能根本不終止,或者產生不正確(次優)結果。
如果您想根據先前算法的結果更改權重並且算法使用 (取決於)權重,則最安全的操作方法是將“更新的”權重存儲在單獨的地圖中,然后應用更改。
最后,我通過在訪問者中存儲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;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.