如何使用boost从文件中读取图形?

时间:2016-06-04 13:17:56

标签: c++ file boost graph

我想使用boost从文件中读取图形。输入文件包含no.of边,后面是成对的边。我想打印邻接列表。我尝试了下面的代码。请帮帮我

    #include <boost/graph/adjacency_list.hpp>
#include <fstream>
#include <boost/graph/graphviz.hpp>
using namespace std;
using namespace boost;
int main(){
    typedef adjacency_list <listS, vecS, directedS> Graph;

    typedef graph_traits<Graph>::vertex_descriptor index_vertex;
    typedef boost::graph_traits <Graph>::edge_iterator edgeIt;
    typedef boost::graph_traits<Graph>::vertex_iterator vertexIt;
    // declare a graph object
    Graph G;
    std::ifstream infile("di.dat");
    index_vertex n_vertices;
    //int n_vertices;
    if(infile >> n_vertices){
        std::cout << n_vertices << endl; // read in number of vertices
    }
    while(infile)
    {
        int f;
        int s;
        infile >> f>> s;
        // std::cout<<first<<second;
        add_edge(f, s, G);     
    }
    infile.close();
    for(pair<vertexIt,vertexIt> vi = boost::vertices(G); vi.first != vi.second; ++vi.first) {
        cout << *vi.first << endl;
    }
    for(pair<edgeIt,edgeIt> ei = boost::edges(G); ei.first != ei.second; ++ei.first) {
        cout << source(*ei.first, G) << " -> " << target(*ei.first, G) << endl;
        //cout << *ei.first << endl;
    }


    ofstream dotfile;
    dotfile.open("test1.dot");
    write_graphviz(dotfile, G);
    system("xdot test1.dot");
    return 0;
}

输入

14
1 2
2 3
3 4
3 5
4 6
6 7
7 8
7 9
7 10
8 11
9 12

12 13
13 14

2 个答案:

答案 0 :(得分:1)

一个基本示例,用于显示出现问题的原因如下:

#include <iostream>

int main(int argc, char**argv)
{
     char j;

     for (int i=0, j='a'; j<'d'; i++, j++)
     {
         std::cout << j << std::endl;
     }

     std::cout << "++++++++++" << std::endl;

         for (j='a'; j<'d';j++)
     {
         std::cout << j << std::endl;
     }

    return 0;
}

输出:

97
98
99
++++++++++
a
b
c

这是抛出此错误的基本示例。使用edge_iterator初始化int。重新审视你的循环,如@Marvin所说。

答案 1 :(得分:0)

for循环中的int i=0, ei_next = ei;定义了一个新的本地int变量ei_next,因为在这种情况下逗号不是逗号运算符而是定义分隔符。 由于eiedge_iterator,因此无法用于初始化int变量ei_next

ei_next = ei移到for语句前面的行中(添加分号)以使其成为作业。