4

頂点 A..C とエッジ E1..E4 を持つ有向マルチグラフがあります

A ---E1--> B
A ---E2--> B
A ---E3--> B
B ---E4--> C

A と B を接続するエッジを繰り返し処理したかったのです。

BGL では、これを次のように表現しました。

#include <boost/graph/adjacency_list.hpp>

struct Vertex
{
  std::string code;
};

struct Edge
{
  double distance;
  std::string code;
};

int main()
{
  using namespace boost;
  typedef adjacency_list<listS, vecS, directedS, Vertex, Edge> Graph;
  Graph g;
  auto a= add_vertex(Vertex{ "A" }, g);
  auto b= add_vertex(Vertex{ "B" }, g);
  auto c= add_vertex(Vertex{ "C" }, g);
  add_edge(a, b, Edge{ 10, "E1" }, g);
  add_edge(a, b, Edge{ 10, "E2" }, g);
  add_edge(a, b, Edge{ 10, "E3" }, g);
  add_edge(a, c, Edge{ 10, "E4" }, g);

  // checking number of edges
  std::cout<< num_edges(g)<< std::endl;

  // printing edges branching from A
  auto erange= out_edges(a, g);
  for(auto i= erange.first; i!= erange.second; ++ i)
    std::cout<< g[*i].code<< std::endl;

  // now we want to iterate over edges that connect A and B
  auto wtf= boost::edge_range(a, b, g);
}

コンパイルエラーが発生します:

In file included from /usr/include/boost/graph/adjacency_list.hpp:246:
/usr/include/boost/graph/detail/adjacency_list.hpp:1617:25: error: no matching constructor for initialization of 'StoredEdge' (aka
      'boost::detail::stored_edge_property<unsigned long, Edge>')
        equal_range(el, StoredEdge(v, fake_edge_container.end(),
                    ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ドキュメントを読みました:

std::pair<out_edge_iterator, out_edge_iterator> edge_range(vertex_descriptor u, vertex_descriptor v, const adjacency_list& g) Returns a pair of out-edge iterators that give the range for all the parallel edges from u to v. This function only works when the OutEdgeList for the adjacency_list is a container that sorts the out edges according to target vertex, and allows for parallel edges. The multisetS selector chooses such a container.

( http://www.boost.org/doc/libs/1_54_0/libs/graph/doc/adjacency_list.html )

グラフを変更しました:

typedef adjacency_list<multisetS, vecS, directedS, Vertex, Edge> Graph;

しかし、エラーは変わりませんでした。

では、BGL を使用して有向マルチグラフの 2 つの頂点 (from-> to) の間のエッジをどのようにリストしますか?

私は素早く汚い方法を見つけました:

auto erange= out_edges(a, g);$
for(auto i= erange.first; i!= erange.second; ++ i)$
  std::cout<< g[*i].code<< " -> "<< g[target(*i, g)].code<< std::endl;$

これにより、ターゲット頂点でエッジをフィルタリングできます。しかし、どのように使用しますboost::edge_rangeか?

4

1 に答える 1

1

このバグは、 Boost メーリングリストで以前に報告されています。

adjacency_list への Directed Selector テンプレート引数が directedS に設定されている場合はコンパイルに失敗しますが、引数が undirectedS または bidirectionalS の場合は機能します。以下に、問題を説明する短いプログラムを添付します。問題は、edge_range() が 3 つの引数を取るコンストラクターを介して StoredEdge をインスタンス化することですが、Directed Selector が指示されている場合、StoredEdge は、そのようなコンストラクターを持たない stored_edge_property に typedef されます。1 つの解決策は、オーバーロードされた edge_range_dispatch() 関数を作成し、
Config::on_edge_storage でディスパッチすることです。

プログラムでに変更directedSするとundirectedS機能します。ライブの例。しかし、それはあなたのアプリケーションに必要なものではないかもしれないので、前に述べた単純なフィルターの方が良いかもしれません. これを Boost メーリングリストに再投稿して、より多くの注目を集めることができます。

于 2013-10-07T12:02:59.610 に答える