#include <iostream>
#include <utility>
#include <algorithm>
#include <vector>

#include "boost/graph/graph_traits.hpp"
#include "boost/graph/adjacency_list.hpp"

using namespace boost;

typedef adjacency_list<vecS, vecS, undirectedS> UndirectedGraph;
typedef boost::graph_traits<UndirectedGraph>::edge_iterator edge_iterator;


int graph_show(UndirectedGraph &g);


int main(int argc, char *argv[])
{
    //UndirectedGraph g;
   
    typedef boost::graph_traits<UndirectedGraph>::edge_descriptor edge_descriptor;
    edge_descriptor ed;
  
    int Nl=4;
  
    std::vector<edge_descriptor> edge_list;
    std::vector<std::vector<edge_descriptor> > graph_edge_list;
    std::vector<UndirectedGraph> graph_list(Nl);  // init Nl graphs in the vector

    bool inserted;
    for (int nb = 0; nb < Nl; ++nb)
    //while(nb<Nl)
    {
        tie(ed,inserted)=add_edge(nb,nb+1,graph_list[nb]);
        edge_list.push_back(ed);
        tie(ed,inserted)=add_edge(nb,nb+1,graph_list[nb]);
        edge_list.push_back(ed);
        graph_edge_list.push_back(edge_list);
        //nb=nb+1;
        //graph_list.push_back(g);
    }

    std::cout<<"size of the graph vector is: "<<graph_list.size()<<std::endl;

    remove_edge(graph_edge_list[0][0],graph_list[0]);
   
    for (int ig = 0; ig < Nl; ++ig) {
        std::cout<<"graph#"<<ig<<std::endl;
        std::cout<<"Size of edge_list is: "<<graph_edge_list[ig].size()<<std::endl;
        graph_show(graph_list[ig]);
    }
    std::cout<<"Success"<<std::endl;
    return 0;
}

int graph_show(UndirectedGraph &g)
{
    std::cout<<"Number of edges is : "<<boost::num_edges(g)<<std::endl;
    std::cout<<"Number of vertices is : "<<boost::num_vertices(g)<<std::endl;
    std::pair<edge_iterator,edge_iterator> ei=edges(g);

    for (edge_iterator edge_iter = ei.first; edge_iter!=ei.second; ++edge_iter) {
            std::cout<<"("<< boost::source(*edge_iter,g)<<","<<boost::target(*edge_iter,g)<<")"<<std::endl;
    }

    typedef boost::graph_traits<UndirectedGraph>::vertex_iterator iter_v;

    std::cout<<"vertices(g)={ ";
    for (std::pair<iter_v,iter_v> p = vertices(g); p.first != p.second; ++p.first) {
            std::cout<< *p.first;
                std::cout<<" ";
    }
    std::cout<<"}"<<std::endl;

    return 0;
}
