2015-12-21 83 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 –