使用boost图合并图

使用boost图合并图,boost,graph,boost-graph,Boost,Graph,Boost Graph,如何使用Boost图形库在两个不同的图形之间添加边。我看过合并/收缩两个顶点的代码,但我不想这样做我想将一个图的结束顶点链接到另一个图的开始顶点,并使其成为一个图。两个图的类型相同 请帮助…首先,我们必须承认生成的图形是单个对象。我假设您希望它与原始的两个图g1和g2是同一类型的图。这意味着您可以选择执行以下操作之一: 图g=g1+g2或g1+=g2(当然,这两个选项都是伪代码) 在任何情况下,结果将包含第二个图形的副本,而不是图形g2的“原始”对象 BGL实际上为您提供了一个函数来精确地实现这

如何使用Boost图形库在两个不同的图形之间添加边。我看过合并/收缩两个顶点的代码,但我不想这样做我想将一个图的结束顶点链接到另一个图的开始顶点,并使其成为一个图。两个图的类型相同


请帮助…

首先,我们必须承认生成的图形是单个对象。我假设您希望它与原始的两个图g1和g2是同一类型的图。这意味着您可以选择执行以下操作之一: 图g=g1+g2或g1+=g2(当然,这两个选项都是伪代码)

在任何情况下,结果将包含第二个图形的副本,而不是图形g2的“原始”对象

BGL实际上为您提供了一个函数来精确地实现这一点,即函数“复制图形”

您可以执行以下操作

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


typedef boost::adjacency_list<> Graph;
typedef Graph::vertex_descriptor vertex_t;

void merging(Graph & g1, vertex_t v_in_g1, const Graph & g2, vertex_t u_in_g2)
{
    typedef boost::property_map<Graph, boost::vertex_index_t>::type index_map_t;


    //for simple adjacency_list<> this type would be more efficient:
    typedef boost::iterator_property_map<typename std::vector<vertex_t>::iterator,
        index_map_t,vertex_t,vertex_t&> IsoMap;

    //for more generic graphs, one can try  //typedef std::map<vertex_t, vertex_t> IsoMap;
    IsoMap mapV;
    boost::copy_graph( g2, g1, boost::orig_to_copy(mapV) ); //means g1 += g2

    vertex_t u_in_g1 = mapV[u_in_g2]; 
    boost::add_edge(v_in_g1, u_in_g1, g1);
}
#包括
#包括
typedef boost::邻接列表图;
typedef图::顶点描述符顶点;
无效合并(图&g1,顶点&u t v\u在&u g1,常量图&g2,顶点&u t u在&u g2)
{
typedef boost::property_map::type index_map\t;
//对于简单邻接列表,此类型将更有效:
typedef boost::iterator_property_map IsoMap;
//对于更通用的图,可以尝试//typedef std::map IsoMap;
IsoMap-mapV;
boost::copy_图(g2,g1,boost::orig_to_copy(mapV));//表示g1+=g2
顶点_t u_in_g1=mapV[u_in_g2];
boost::添加_边(v_in_g1,u_in_g1,g1);
}

另请参见

我认为没有一个函数允许您这样做,我认为您必须手动合并它们,但我不是专家。为了最大限度地获得一个好的答案,您可能应该添加标签。我尝试过,发现您需要初始化mapV才能工作。否则,迭代器对于默认向量是局部的,会导致问题。特别是:
vector orig2copy_数据(num_顶点(g2));IsoMap mapV=make_iterator_property_map(orig2copy_data.begin(),get(顶点索引,g2))