2

有向グラフ(boost ::graphライブラリからadjacency_graphを介して実装)があり、特定の頂点の親頂点を見つけようとしています。

以前は(pygraphを介して)単に有向グラフを反転してからネイバー検索を実行しましたが、boost :: reverse_graphを使用してグラフを反転すると、有向グラフが双方向グラフに変わるため、隣接する頂点メソッドを使用できません。もう。

親頂点を取得するためのより良い方法はありますか?

ありがとう。

これが私の現在のサンプルコードです:

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/reverse_graph.hpp>
#include <iostream>

typedef boost::adjacency_list< boost::setS, boost::vecS, boost::directedS > Graph;
typedef boost::reverse_graph<Graph> Rgraph;
typedef Graph::vertex_descriptor Vertex;

int main()
{
    Graph graph;
    Vertex v0 = boost::add_vertex(graph);
    Vertex v1 = boost::add_vertex(graph);
    Vertex v2 = boost::add_vertex(graph);
    Vertex v3 = boost::add_vertex(graph);
    Vertex v4 = boost::add_vertex(graph);
    Vertex v5 = boost::add_vertex(graph);
    Vertex v6 = boost::add_vertex(graph);

    boost::add_edge(v0,v1,graph);
    boost::add_edge(v1,v2,graph);
    boost::add_edge(v2,v3,graph);
    boost::add_edge(v2,v4,graph);
    boost::add_edge(v3,v5,graph);
    boost::add_edge(v4,v5,graph);
    boost::add_edge(v5,v6,graph);

    Graph::adjacency_iterator ibegin, iend;
    for (boost::tie(ibegin, iend) = boost::adjacent_vertices(v2, graph); ibegin != iend; ++ibegin)
    {
        std::cout << *ibegin << std::endl;
    }

    std::cout << std::endl << "############# RGRAPH #############" << std::endl << std::endl;

    Rgraph rgraph(graph);
    Rgraph::adjacency_iterator rbegin, rend;
    for (boost::tie(rbegin, rend) = boost::adjacent_vertices(v2, rgraph); rbegin != rend; ++rbegin)
    {
        std::cout << *rbegin << std::endl;
    }
    std::cout << std::endl;

    return 0;
}
4

1 に答える 1

7

reverse_graph適応グラフがのモデルである必要がありBidirectionalGraphます。グラフをtypedef boost::adjacency_list< boost::setS, boost::vecS, boost::bidirectionalS > Graph;プログラムに変更すると、コンパイルされて結果が得られます。

3
4

############# RGRAPH #############

1

私はあなたが期待すべきことだと信じています。

reverse_graph(ただし、まだ必要な)を必要としない別の方法bidirectionalSは、次を使用することです。

Graph::out_edge_iterator out_begin, out_end;
for (boost::tie(out_begin, out_end) = out_edges(v2,graph); out_begin != out_end; ++out_begin)
{   
    std::cout << target(*out_begin,graph) << std::endl;
}
std::cout << std::endl;

Graph::in_edge_iterator in_begin, in_end;
for (boost::tie(in_begin, in_end) = in_edges(v2,graph); in_begin != in_end; ++in_begin)
{   
    std::cout << source(*in_begin,graph) << std::endl;
}
std::cout << std::endl;
于 2012-12-10T10:45:58.413 に答える