4

Boost Graph Library を使用して、2 つの異なるグラフ間にエッジを追加するにはどうすればよいですか。2 つの頂点をマージ/縮小するコードを見てきましたが、そうしたくありません。あるグラフの終了頂点を別のグラフの開始頂点にリンクして、1 つのグラフにしたい。どちらのグラフも同じタイプです。

助けてください...

4

1 に答える 1

4

まず、結果のグラフが SINGLE オブジェクトであることを認めなければなりません。元の 2 つのグラフ g1 および g2 と同じタイプの Graph にしたいと思います。これは、次のいずれかを実行する選択肢があることを意味します: グラフ g = g1 + g2 または g1 += g2 (もちろん、どちらの選択も疑似コードにあります)。

いずれにせよ、結果には、グラフ g2 の「元の」オブジェクトではなく、2 番目のグラフのコピーが含まれます。

BGL は実際にそれを正確に行うための関数、つまり関数 " copy_graph "を提供します。

次のようなことができます

#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);
}

グラフ (adjacency_list) を別のグラフにコピーするも参照してください。

于 2013-10-14T10:00:22.360 に答える