Boost子图和捆绑属性
Boost Subgraph and Bundled properties
我正在使用捆绑属性和adjacency_list,并希望使用子图类。
struct Vertex
{
int index;
int seed;
};
struct Edge
{
bool visted;
double weight;
};
typedef adjacency_list<listS, listS, undirectedS, Vertex, property<edge_index_t,int,Edge> > Graph;
typedef subgraph<Graph> testSubgraph;
需要property<edge_index_t,int,Edge>
部分,因为子图需要edge_index_t
来比较两条边。
现在我的问题是如何在子图中使用捆绑属性添加边缘?在没有property<edge_index_t,int,Edge>
的法线图中,我按如下方式添加一条边:
Edge e;
vertex_descriptor u,v;
// fill in u and v;
e.weight = 1.0;
e.visted=false;
add_edge(u,v,e,graph);
但这对Subgraph不起作用。
希望有人知道解决这个问题的办法。
感谢本我刚刚遇到了一个类似的问题,当试图添加一个顶点与add_vertex()
函数,并发现有一个(非常老)未解决的问题上的boost bugtracker:
Ticket #380:支持在图形适配器中捆绑属性:
图形适配器(如subgraph)不支持绑定属性,但它们应该。
进一步搜索得到以下两个补丁,它们尚未合并,但似乎最终带来了对子图中捆绑属性的支持:
- Ticket #10708: add_vertex()方法对子图 的属性支持
- Ticket #10709:在子图 中支持图形绑定属性
所以我猜答案是:现在,不要使用捆绑属性。但在未来,这个问题应该会消失。
邻接表没有edge_index:es。您需要自己分配索引,但这很简单,只需将size_t index
添加到Edge
,并在创建边时分配索引即可。
您可能不需要为子图创建边,因为boost子图是诱导子图。因此,图中所有端点都在子图中的边都将包含在子图中。
我也正在学习BGL,下面的代码用于在add_edge
调用中添加绑定的边缘属性。
boost::add_edge(vd1, vd2, testSubgraph::edge_property_type{0, Edge{/* ... */}}, graph);
0
是一个虚拟的边索引,根据我的经验,BGL会用合适的边索引覆盖它。我不知道这是否总是正确的(欢迎任何评论)。
您也可以直接添加边到子图,而不使用bundle,并使用add_edge
返回的边描述符稍后添加属性。
auto pair = boost::add_edge(vd1, vd2, graph);
boost::put(boost::get(&Edge::member_name1, graph), pair.first, member_value1);
/* ... */
不知道是否可以使用第二个方法来put
一个完整的属性包
- 如何在 boost 中访问现有图的子图
- 以编程方式连接子图
- 需要使用boost ::图形从一个大图中找到子图
- 子图的图形特征
- 提升图相等性和子图
- 如何删除提升图的子图
- 子图和图连接在提升
- Boost子图复制构造函数不适用于Qt 5.0.2和MinGW
- 如何访问提升子图'graph'属性?
- 使用write_graphviz()打印组成的子图
- Boost子图实现和使用Graphml导出
- 是否有任何方法可以使用c++ libgraph为子图设置默认节点属性?
- 我应该用过滤图还是子图,还是别的什么
- 增强BGL:边缘属性贴图
- 为什么Boost VF2子图同构给出一个不正确的答案
- 图的子图求值问题
- Boost子图和捆绑属性
- 查找子图中的边
- 如何有效地实现具有大量大完整子图的图
- 如何用集合顶点列表创建boost子图