在Boost图形库中进行BFS时如何修改属性

How to modify properties while proceeding BFS in Boost Graph Library?

本文关键字:何修改 修改 属性 图形库 Boost BFS      更新时间:2023-10-16

我使用捆绑属性的图形。定义如下:

class Node
{
    void AssignPlane(Plane& p)
    Plane* dp;
    double errors;
}
void Node::AssignPlane(Plane& p)
{
    dp=&p;
    errors=p.a+p.b+p.c;// simplified
}
typedef adjacency_list<vecS,vecS,bidirectionalS,Node,float> NGraph;
//...
struct NVisitor: default_bfs_visitor
{
    void discover_vertex(VertexDesc u, const NGraph& g) const
    {
        // CAN'T MODIFY G
    }
}

但是我不能简单地调用g[u]. assignplane (p)来修改顶点,也不能获得指向顶点的指针,这两个对我来说都是至关重要的。
虽然这个问题看起来很愚蠢,但作为Boost的新手,我已经花了两周的时间来适应Boost代码的复杂风格,我真的需要帮助。
请不要试图回答"你需要使用BGL以外的东西",因为除了BGL之外,我找不到任何支持我工作的东西。
我还必须说,官方文档并不是要用一种更简单的方式来解释他们的伟大工作。因为文档我已经看了几十遍了,所以不建议我重读文档。
我将感激任何有用的帮助,并提前说谢谢。

您可以使字段可变

class Node
{
    void AssignPlane(Plane& p) const;
    Plane* mutable dp;
    double mutable errors;
}
void Node::AssignPlane(Plane& p) const
{
    dp=&p;
    errors=p.a+p.b+p.c;// simplified
}

否则,考虑在访问者内部保存对图的非const"引用":

struct NVisitor: default_bfs_visitor
{
    NGraph* gref_;
    NVisitor(NGraph& g) : gref_(&g) {}
    void discover_vertex(VertexDesc u, const NGraph& g) const
    {
        Plane* p = /*get it somewhere*/;
        (*gref_)[u].AssignPlane(p);
    }
}

注意不要破坏BFS的不变量(比如,不要在遍历时编辑边缘)。

您调查过活动访客吗?

在这个例子中,看起来图是通过非const引用传入的:

深度优先搜索事件访问者

Boost Event visitor