【问题标题】:Using boost graph library: how to create a graph by reading edge lists from file使用 boost 图形库:如何通过从文件中读取边列表来创建图形
【发布时间】:2014-04-29 10:57:16
【问题描述】:

我是 boost 图形库的新手,我想通过从文件中读取边列表来创建图形。

edge_list.dat 文件的示例如下:

...
123 445
4535 343
3432 454
123 345
123 566
...

文件的每一行代表图的一条边,每行的两个数字是边对应的节点id。现在我想使用 boost 图形库从文件 edge_list.dat 创建一个图形。

但是,我事先不知道图表的大小。我需要沿途将顶点添加到图中。然而,像这样为每个顶点创建一个顶点描述符是不切实际的:

Graph::vertex_descriptor v0 = boost::add_vertex(g);
Graph::vertex_descriptor v1 = boost::add_vertex(g);

我想通过顶点 id 访问顶点。我真的不知道该怎么做。目前我想出的解决方案是创建一个映射,其键是 id,值是 vertex_descriptor:

std::map<int,Graph::vertex_descriptor> VertexList;
VertexList[123]=boost::add_vertex(g);

但是有没有一种方法可以在不创建地图的情况下做到这一点?

提前致谢。

【问题讨论】:

    标签: c++ boost graph


    【解决方案1】:

    太好了。雄心勃勃,呵呵:)

    Boost 图形库。和文本解析。让我们看看我们能做些什么:提升图谱 + 提升灵气 = 良好的团队合作。

    看Live On Coliru

    #include <boost/fusion/adapted/std_pair.hpp>
    #include <boost/spirit/include/qi.hpp>
    #include <boost/graph/edge_list.hpp>
    #include <fstream>
    
    typedef std::pair<int,int> Edge;
    typedef std::vector<Edge> EdgeList;
    typedef boost::edge_list<EdgeList::iterator> Graph;
    
    namespace qi = boost::spirit::qi;
    
    int main()
    {
        std::ifstream ifs("input.txt");
        ifs >> std::noskipws;
    
        boost::spirit::istream_iterator f(ifs), l;
    
        std::vector<Edge> edges;
        bool parse_ok = qi::phrase_parse(f, l, (qi::int_ >> qi::int_) % qi::eol, qi::blank, edges);
    
        Graph g(edges.begin(), edges.end());
    
        if (parse_ok)
        {
            std::cout << "Graph parsed with " << num_edges(g) << " edges\n";
        } else
            std::cout << "Parse error\n";
    
        if (f!=l)
            std::cout << "Remaining unparsed input: '" << std::string(f,l) << "'\n";
    }
    

    打印(对于上面的有效输入行):

    Graph parsed with 5 edges
    Remaining unparsed input: '
    '
    

    【讨论】:

    • 啊哈,这是进行文本措辞的一种时尚方式!但为了更通用的目的,我想使用相邻列表类,以便我可以利用大部分图形概念并实现最大的灵活性。因此,我想将节点 ID 视为顶点的属性,而不是顶点描述符。但我也想使用节点 ID 来访问顶点描述符。似乎属性映射类只能将描述符映射到描述符的属性。我不知道该怎么做。
    • 嗯。这些是完全不同的问题。另外,我没有看到矛盾(为什么是“但是”)。多年的经验让我非常有信心,我可以轻松地使解析适应您的图形类型。如果您对 adjacency_list 有不相关的问题,您应该考虑提出一个新问题。
    • 最后,BGL 使用顶点作为节点的术语。所以节点ID是定义的顶点ID。你只是想以不同的方式存储它。我认为 BGL 称之为捆绑属性?
    • 当我尝试在系统上编译时出现以下错误。 error: 'istream_iterator' is not a member of 'boost::spirit'
    • 致发布this follow-up的@user8793459;使用 Spirit 有点笑话,因为这个问题是如此不受约束,基本上没有表现出任何先前的努力。这是一个简单的纯 C++ 标准库方法:coliru.stacked-crooked.com/a/3ef8b37871333756
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2013-07-01
    相关资源
    最近更新 更多