首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ boost::graph从有向图中获取父顶点

c++ boost::graph从有向图中获取父顶点
EN

Stack Overflow用户
提问于 2012-12-10 17:49:32
回答 1查看 3.5K关注 0票数 2

我有一个有向图(通过boost::graph库中的adjacency_graph实现),并且我正在尝试查找某个顶点的父顶点。

在过去(通过pygraph),我只是简单地反转了有向图,然后进行了邻居搜索,但似乎使用boost::reverse_graph反转图会将我的有向图转换为双向图,因此我不能再使用adjacent_vertices方法。

有没有更好的方法来获取父顶点?

谢谢。

下面是我当前的示例代码:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-10 18:45:58

reverse_graph要求改编的图形是BidirectionalGraph的模型。如果您将图形更改为typedef boost::adjacency_list< boost::setS, boost::vecS, boost::bidirectionalS > Graph;,则程序将编译并给出结果:

代码语言:javascript
复制
3
4

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

1

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

另一种不需要reverse_graph (但仍然需要bidirectionalS)的方法是使用:

代码语言:javascript
复制
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;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13798465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档