如何在Boost图库中继续BFS时修改属性?

时间:2015-09-21 09:46:33

标签: c++ boost graph breadth-first-search

我正在使用捆绑属性作为图表。定义如下:

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之外我什么都找不到支持我的工作。
我还必须说,官方文件并不是要以更简单的方式解释他们的伟大工作。由于我已经阅读了几十次文档,所以不建议我重新阅读文档。
我将感谢任何有用的帮助,并提前谢谢你。

2 个答案:

答案 0 :(得分:1)

你可以让字段变得可变

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&#34;引用&#34;到访问者内部的图表:

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的不变量(比如,在遍历时不要编辑边缘)。

答案 1 :(得分:0)

你有没有看过活动参观者?

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

Depth-First Search Event Visitor

Boost Event Visitors