簡體   English   中英

Boost Subgraph 和 Bundled 屬性

[英]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 上有一個(非常老的)未解決的問題:

票證 #380:支持圖形適配器中的捆綁屬性

圖適配器(例如子圖)不支持捆綁屬性,但它們應該支持。


進一步搜索導致以下 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM