Boost logo

Boost :

Subject: [boost] [BGL]
From: Pablo Madoery (madoerypablo_at_[hidden])
Date: 2014-06-11 09:36:10


Hello, I Have 2 graphs: graph1 and graph2, and two sets of edge descriptors.
One set is associated to edges of graph1 and another set associated to
edges of graph2.
I don't understand why is it possible to access information about edges of
graph2 by using graph1 and the edge descriptors of graph2.
I realized of that because of an own mistake when using graphs.
What I would like to know is why is that possible to do and if it should be
an exception that can handle this situation.

I send the code I was using to test this:

#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <fstream>
#include "GraphInfo.h"

using namespace std;
using namespace boost;
typedef adjacency_list<setS, vecS, bidirectionalS, VertexInfo, EdgeInfo>
Graph;

void printGraph(Graph graph, string file)
{
    ofstream ofs(file.c_str());
    dynamic_properties dp;
    dp.property("node_id", get(vertex_index, graph));
    dp.property("label", get(&EdgeInfo::weight, graph));
    write_graphviz_dp(ofs, graph, dp);
}

int main()
{
    Graph graph1;
    Graph::vertex_descriptor a1 = add_vertex(graph1);
    Graph::vertex_descriptor b1 = add_vertex(graph1);
    Graph::vertex_descriptor c1 = add_vertex(graph1);
    Graph::edge_descriptor e1 = (add_edge(a1, b1, graph1)).first;
    Graph::edge_descriptor e2 = (add_edge(b1, a1, graph1)).first;

    graph1[a1].id = 10;
    graph1[b1].id = 20;
    graph1[c1].id = 30;
    graph1[e1].weight = 1;
    graph1[e2].weight = 2;

    Graph graph2;
    Graph::vertex_descriptor a2 = add_vertex(graph2);
    Graph::vertex_descriptor b2 = add_vertex(graph2);
    Graph::vertex_descriptor c2 = add_vertex(graph2);
    Graph::vertex_descriptor d2 = add_vertex(graph2);
    Graph::edge_descriptor e4 = (add_edge(c2, b2, graph2)).first;
    Graph::edge_descriptor e5 = (add_edge(b2, c2, graph2)).first;
    Graph::edge_descriptor e6 = (add_edge(d2, a2, graph2)).first;
    Graph::edge_descriptor e7 = (add_edge(a2, d2, graph2)).first;

    graph2[a2].id = 10;
    graph2[b2].id = 20;
    graph2[c2].id = 30;
    graph2[e4].weight = 13;
    graph2[e5].weight = 14;
    graph2[e6].weight = 15;
    graph2[e7].weight = 16;

    // WHY IS THIS POSSIBLE TO DO
    // IT IS ASKING FOR AN EDGE OF GRAPH2 BUT USING GRAPH1 ???
    double weight = graph1[e7].weight;
    cout<<"weight: "<<weight<<endl;

    printGraph(graph1, "graph1.dot");
    printGraph(graph2, "graph2.dot");
    cout << "end" << endl;

    return 0;
}

Thank you very much



graph1.png
graph2.png

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk