[英]Boost Subgraph and Bundled properties
我正在使用捆綁屬性和 adjacency_list 並想使用 subgraph 類。
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 上有一個(非常老的)未解決的問題:
圖適配器(例如子圖)不支持捆綁屬性,但它們應該支持。
進一步搜索導致以下 2 個補丁,它們尚未合並,但似乎最終帶來了對子圖中捆綁屬性的支持:
所以我想答案是:現在,不要使用捆綁屬性。 但在未來,這個問題應該會消失。
鄰接列表沒有 edge_index:es。 您需要自己分配索引,但這就像將size_t index
添加到Edge
並在創建邊緣時分配索引一樣簡單。
您可能不需要為子圖創建邊,因為增強子圖是誘導子圖。 因此,圖中兩個端點都在子圖中的所有邊都將包含在您的子圖中。
我也只是在學習 BGL,以下代碼可用於在add_edge
調用中添加捆綁的邊緣屬性。
boost::add_edge(vd1, vd2, testSubgraph::edge_property_type{0, Edge{/* ... */}}, graph);
0
是一個虛擬邊緣索引,根據我的經驗,它會被 BGL 用正確的邊緣索引覆蓋。 我不知道這是否總是正確的(歡迎任何評論)。
您也可以在不使用捆綁包的情況下將邊添加到子圖中,並使用add_edge
返回的邊描述符稍后添加屬性。
auto pair = boost::add_edge(vd1, vd2, graph);
boost::put(boost::get(&Edge::member_name1, graph), pair.first, member_value1);
/* ... */
不知道是不是可以用第二種方法put
一個完整的property bundle。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.