2

我有一个图,我想将其类型更改为子图,以便能够将其划分为更多子图,从而使用 graphviz 获得更多的纵坐标打印。问题是当我将子图属性添加到我的图时,顶点描述符不再起作用。

修改前的代码:

    #include "Node.cpp"
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/property_map/property_map.hpp>
    #include <boost/graph/graph_traits.hpp>
    #include <boost/graph/subgraph.hpp>

    using namespace boost;

    typedef adjacency_list<vecS, vecS, directedS, Node, property < edge_weight_t, float > > mygraph;
    typedef graph_traits < mygraph >::vertex_descriptor vertex_descriptor;
    ...

将图改为子图后的代码:

    #include "Node.cpp"
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/property_map/property_map.hpp>
    #include <boost/graph/graph_traits.hpp>
    #include <boost/graph/subgraph.hpp>

    using namespace boost;

   typedef subgraph<adjacency_list<vecS, vecS, directedS, Node, property < edge_weight_t, float > > >mygraph;
   typedef graph_traits < mygraph >::vertex_descriptor vertex_descriptor;   //ERROR
   ...

问题是什么?我该如何解决?

4

1 回答 1

3

问题不在于特征本身。

子图需要一个 edge_index 属性,因为它存储了一个本地映射:

    typedef std::map<edge_index_type, edge_descriptor> LocalEdgeMap;
    LocalEdgeMap m_local_edge; // global -> local

因为没有edge_index_t属性,所以地图的键类型计算为void

这记录在这里: http: //www.boost.org/doc/libs/1_55_0b1/libs/graph/doc/subgraph.html

底层图类型需要有 vertex_index 和 edge_index 内部属性,所以我们在邻接表中添加一个边索引属性。我们不需要添加顶点索引属性,因为它内置在 adjacency_list 中。我们将在图 1 中构建图和子图,因此我们总共需要六个顶点

考虑添加边缘索引:

typedef subgraph<adjacency_list<vecS, vecS, directedS, Node, property < edge_index_t, index > > >mygraph;
typedef graph_traits < mygraph >::vertex_descriptor vertex_descriptor;   // COMPILES
于 2014-01-31T11:59:01.703 回答