簡體   English   中英

為什么BGL中的訪問者無法更改邊緣屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM