使用 boost 作为向量的元素在图中添加顶点

Posted

技术标签:

【中文标题】使用 boost 作为向量的元素在图中添加顶点【英文标题】:Adding vertex in graph using boost as the elements of a vector 【发布时间】:2018-01-14 09:37:12 【问题描述】:

我有一个向量说 [3,2,1,8,7]。 Graph的顶点应该是3,2,1,8,7。我怎样才能在循环中创建它。我可以在遍历这个向量的循环中使用 boost 的 add_vertex 函数吗?或者将这些向量元素添加为图的顶点的最佳方法是什么?

这是我尝试过的。 Group4 是[3,2,1,8,7]的向量。

    struct Vertex float foo;;
    typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex > Graph;
    typedef boost::graph_traits < Graph >::vertex_descriptor vertex_t;
    Graph g(Group4.size());
    vertex_t Vertices[Group4.size()];
        for(T_INDEX i=0;i<Group4.size();i++)
            Vertices[i] = boost::add_vertex(Group4[i], g);
        

        g[Group4[0]].foo = 3.4;

        boost::add_edge(Group4[0],Group4[2],g);
        boost::add_edge(Group4[1],Group4[2],g);

我遇到了错误。

【问题讨论】:

嗯,当然可以使用循环。是什么让你认为你做不到?顺便说一句:就目前而言,这看起来很像家庭作业,并且您希望其他人为您编写代码。这不会发生。 【参考方案1】:
   Vertices[i] = boost::add_vertex(Group4[i], g);

这会添加一个带有“Group4[i]”作为捆绑属性的顶点。这不起作用,因为它不是 Vertex 对象。相反,尝试

   Vertices[i] = add_vertex(Vertex3.4, g);

甚至

   Vertices[i] = add_vertex(3.4, g);

有效:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct Vertex 
    float foo;
;

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t;
using T_INDEX = Graph::vertices_size_type;

int main() 
    std::vector<int> Group4 3, 2, 1, 8, 7 ;

    Graph g(Group4.size());
    std::vector<vertex_t> vertices(Group4.size());

    for (T_INDEX i = 0; i < Group4.size(); i++) 
        vertices[i] = add_vertex(Vertex 3.4 , g);
    

    boost::add_edge(Group4[0], Group4[2], g);
    boost::add_edge(Group4[1], Group4[2], g);

注意我用 std::vector 替换了您的 VLA,因为可变长度数组是非标准的

真正的问题

查看其余代码,在我看来,您确实在努力处理从顶点“id”(3、2、1、8、7)到顶点描述符的映射。

你有什么工作,但从它的外观来看,你可以直接使用索引作为顶点描述符。

注意这仅适用于您的顶点容器支持整数描述符并且您不会有非常稀疏的 id 空间(例如,如果您有 id 1、2、3 和 88837674,您将为88837675个顶点,效率不高。

代码可能变成:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct Vertex  float foo; ;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex> Graph;

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

int main() 
    std::vector<int> Group4  3, 2, 1, 8, 7 ;
    Graph g(1 + *std::max_element(Group4.begin(), Group4.end()));

    for (int v : Group4)
        g[v].foo = 3.4;

    boost::add_edge(0, 2, g);
    boost::add_edge(1, 2, g);

    print_graph(g);

这会打印图表,如下所示:

0 --> 2 
1 --> 2 
2 --> 
3 --> 
4 --> 
5 --> 
6 --> 
7 --> 
8 --> 

【讨论】:

是否有可能像我希望顶点仅来自该向量。那就是顶点应该只有[3,2,1,8,7]并且不应该包含[0,4,5,6].??

以上是关于使用 boost 作为向量的元素在图中添加顶点的主要内容,如果未能解决你的问题,请参考以下文章

Graph-GCN

使用Boost Graph库查找连接的组件,顶点和边缘类型为boost :: listS

删除顶点并再次添加它会导致 boost::graph 崩溃?

使用 Boost 的图 breadth_first_search() 在未加权、无向图中查找路径

二分图中最小顶点覆盖的算法

通过允许用户选择顶点数使用 Boost 库生成图形