【问题标题】:How to modify properties while proceeding BFS in Boost Graph Library?如何在 Boost Graph Library 中进行 BFS 时修改属性?
【发布时间】:2015-09-21 09:46:32
【问题描述】:

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

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 之外,我找不到任何支持我的工作的东西。
而且我还必须说,官方文档并不是为了以更简单的方式解释他们的伟大工作。由于我已经阅读了数十次文档,因此不建议我重新阅读文档。
我会感谢任何有用的帮助,并提前说声谢谢。

【问题讨论】:

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


    【解决方案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
    }
    

    否则,请考虑对访问者内部的图形进行非常量“引用”:

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

    【讨论】:

      【解决方案2】:

      您是否调查过活动访客?

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

      Depth-First Search Event Visitor

      Boost Event Visitors

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        相关资源
        最近更新 更多