2015-12-01 27 views
2

我正在使用Boost庫來處理C++中的圖。當增加一條邊時,使增強圖僅包含兩個頂點

boost::adjacency_list <boost::vecS, boost::vecS, boost::bidirectionalS> DiGraph; 
DiGraph graph; 
boost::add_edge(10000, 20000, graph); 

包含20001個頂點和一條邊。然而,我只需要有兩個頂點1000020000

一種可能的方法是將數據與節點相關聯(例如從this example);然而,也許有一個更簡單的方法來做到這一點。如果頂點不是(0,1),我怎麼能有一個包含2個頂點和一個邊的圖?

python networkx我只會使用graph.add_edge(10000, 20000)並會得到所需的行爲。任何線索如何在C++中做到這一點?

+0

默認行爲的確有索引標識頂點。所以,如果只在頂點10和頂點20之間創建一條邊,那麼該圖就會保存21個頂點。 你需要的是一個帶有自由標識符的頂點模型,所以,是的,研究鏈接的例子,它包含你所需要的。好處是你可以在頂點填充任何你想要的東西。 – kebs

+0

嗯,我寧願避免這種情況。 –

回答

1

您應該爲頂點集合使用基於節點的容器選擇器。

E.g.使用listS

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graph_utility.hpp> 

int main() { 
    typedef boost::adjacency_list <boost::vecS, boost::listS, boost::bidirectionalS, int> DiGraph; 
    DiGraph graph; 

    DiGraph::vertex_descriptor 
     v1 = add_vertex(100000, graph), 
     v2 = add_vertex(200000, graph); 

    boost::add_edge(v1, v2, graph); 
    boost::print_graph(graph, boost::get(boost::vertex_bundle, graph)); 
} 

注意vertex_index沒有免費的午餐,現在(你必須通過/手動維護它的所有算法)。

另一方面,迭代器和描述符是穩定的(除非被刪除)。