C++ c++;boost::graph从有向图获取父顶点

C++ c++;boost::graph从有向图获取父顶点,c++,boost,graph,boost-graph,directed-acyclic-graphs,C++,Boost,Graph,Boost Graph,Directed Acyclic Graphs,我有一个有向图(通过boost::graph库中的邻接图实现),我试图找到某个顶点的父顶点 在过去(通过pygraph),我只是简单地反转了有向图,然后进行了邻居搜索,但似乎使用boost::reverse_graph反转图会将我的有向图变成双向图,因此我不能再使用相邻_顶点方法 是否有更好的方法获取父顶点 谢谢 下面是我当前的示例代码: #include <boost/graph/adjacency_list.hpp> #include <boost/graph/revers

我有一个有向图(通过boost::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;
}
#包括
#包括
#包括
typedef boost::adjacence_list图形;
typedef boost::反向图形Rgraph;
typedef图::顶点\描述符顶点;
int main()
{
图形;
顶点v0=boost::添加_顶点(图);
顶点v1=boost::添加_顶点(图形);
顶点v2=boost::添加_顶点(图);
顶点v3=boost::添加_顶点(图);
顶点v4=boost::添加_顶点(图);
顶点v5=boost::添加_顶点(图);
顶点v6=boost::添加_顶点(图);
boost::添加_边(v0,v1,图形);
boost::添加_边(v1、v2、图形);
boost::添加_边(v2,v3,图形);
boost::添加_边(v2,v4,图形);
boost::添加_边(v3、v5、图形);
boost::添加_边(v4、v5、图形);
boost::添加_边缘(v5、v6、图形);
图:邻接迭代器ibegin,iend;
for(boost::tie(ibegin,iend)=boost::相邻_顶点(v2,图);ibegin!=iend;++ibegin)
{
std::cout要求调整后的图形是的模型。如果将图形更改为
typedef boost::adjacency\u listgraph;
您的程序将编译并给出结果:

3
4

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

1
我相信这是你应该期待的

另一种不需要反向图(但仍然需要双向图)的方法是使用:

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;
Graph::out\u edge\u迭代器out\u begin,out\u end;
for(boost::tie(out\u begin,out\u end)=out\u边(v2,图形);out\u begin!=out\u end;++out\u begin)
{   

std::我想可以使用双向图作为有向图,并且只在父顶点查找时反转它吗?@Shootfast也使用双向有向图。根据第三个tem,方法
邻居
事件
基本上就是我添加的
外边
内边
plate参数是“一个选择器,用于选择图形是有向的、无向的还是双向边访问(访问出边和入边)。选项是有向的、无向的和双向的。”@Shootfast代码中有一个错误,大小写为
双向