2015-12-21 76 views
0

我有一個頂點和邊的表,並從這些表中創建了一個Boost圖。每個頂點邊都有它的ID分配給它,而邊也包含長度。現在我想通過刪除節點來修剪圖。我的算法是通過創建一個num_vertices矩陣完成的。我的問題是如何將我的矩陣與boost :: vertices關聯起來,那就是我怎麼知道哪個矩陣列對應於圖中的我的頂點,因爲矩陣沒有id。希望我沒有想太複雜。Boost從其創建的矩陣中識別頂點的圖形

void Nodekiller::build_matrix(){ 
    int ndsize=num_vertices(graph); 
    double matrixtb[ndsize][ndsize]; 
    for(int i=0; i<ndsize;i++){ 
     for (int j=0;j<ndsize; j++){ 
      if(i==j) {matrixtb[i][j]=0;} 
      else { 
       matrixtb[i][j]=addEdgeValue(); //if none add random value 
      } 
     } 
    } 
} 

//i want to to sum each column and then prioritize them based on the values gotten. 

所以我不知道如何將boost :: vertices(graph)與其他矩陣關聯起來以修剪圖形。

回答

0

這個問題不是很清楚。難道我的理解對不對:

  1. 你有一個提升圖形
  2. 創建從圖中的矩陣?

因此,第一個微不足道的問題(也許在範圍之外):你真的需要同一個graphe的兩個表示嗎?一個作爲boost :: graph,另一個作爲矩陣?

您可以輕鬆地從boost ::圖形中添加和刪除邊線。最簡單的表示是鄰接表:http://www.boost.org/doc/libs/1_55_0/libs/graph/doc/adjacency_list.html

也許出發點可能是這樣的回答:adding custom vertices to a boost graph

您可以創建所有的節點,遍歷每個節點上,並添加只有當兩個節點是不同的一個頂點。例如:

boost::graph_traits<Graph>::vertex_iterator vi, vi_end; 

boost::tie(vi, vi_end) = boost::vertices(g); 
boost::tie(vi2, vi2_end) = boost::vertices(g); 
    for (; vi != vi_end; ++vi) { 
    for (; vi2 != vi2_end; ++vi2) { 
     if(*vi != *vi2) { 
     boost::add_edge(
     edge_t e; bool b; 
     boost::tie(e,b) = boost::add_edge(u,v,g); 
     g[e] = addEdgeValue(); 
     } 
    } 
} 
+0

也許我沒有把問題放在正確的位置,第一件事就是我有一個帶有邊和節點的提升圖。從這張圖中,我必須修剪圖中的節點。我可以使用的算法是基於行進時間矩陣,而對角線始終爲零,因爲沒有從節點A行進到A的值。我的問題是,如果我創建一個大小爲n的矩陣並計算每個單元的矩陣,根據算法得到每個節點的值,我怎麼從boost圖中識別節點,因爲沒有id進入矩陣表。 – festy

+0

好吧,在我的例子中,你也可以刪除在單個節點上循環的邊緣;) 否則,如果你堅持讓你的圖表代表兩次,'typedef boost :: graph_traits :: vertex_descriptor vertex_t;'實際上是一個簡單的整數,所以你可以使用作爲一個ID。 您可能還想看看boost :: graph的矩陣表示:http://www.boost.org/doc/libs/1_58_0/libs/graph/doc/adjacency_matrix.html –