c++ - 如何在 Boost Graph Library 中进行 BFS 时修改属性?

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

最佳答案

你可以让字段可变

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

关于c++ - 如何在 Boost Graph Library 中进行 BFS 时修改属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32692075/

相关文章:

c++ - 如何在 Windows 上修复 VS 2019 中的 SFML 错误?

c++ - 如何在 C++ 中定义新的数字系统

c++ - boost 隐式图和 astar_search_no_init

添加节点的效果未知时寻找最便宜路径的算法

c++ - 生成 GL_INVALID_VALUE 错误。无效的纹理尺寸。在 Cubemap 纹理上 427*240*6

multithreading - Boost:多线程性能,线程/套接字的重用

c++ - 使用 boost::unordered_map 时如何计算键冲突?

java - 旅游网站背后的算法

graph - 在 WHERE 子句中使用聚合函数 (Neo4j)

c++ - 尝试在 Qt 中使用 boundingRect