123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // Copyright 2008 Trustees of Indiana University
- // Use, modification and distribution is subject to the Boost Software
- // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // An example of using read_graphviz to load a GraphViz Dot textual
- // graph into a BGL adjacency_list graph that has custom properties.
- // Author: Ronald Garcia
- #include <boost/graph/graphviz.hpp>
- #include <boost/graph/adjacency_list.hpp>
- #include <boost/foreach.hpp>
- #include <string>
- #include <sstream>
- using namespace boost;
- using namespace std;
- //
- // Create a custom graph properties
- // (see the documentation for adjacency list)
- struct graph_identifier_t { typedef graph_property_tag kind; };
- struct vertex_label_t { typedef vertex_property_tag kind; };
- int main() {
- // Vertex properties
- typedef property < vertex_name_t, string,
- property < vertex_label_t, string,
- property < vertex_root_t, int > > > vertex_p;
- // Edge properties
- typedef property < edge_name_t, string > edge_p;
- // Graph properties
- typedef property < graph_name_t, string,
- property < graph_identifier_t, string > > graph_p;
- // adjacency_list-based type
- typedef adjacency_list < vecS, vecS, directedS,
- vertex_p, edge_p, graph_p > graph_t;
- // Construct an empty graph and prepare the dynamic_property_maps.
- graph_t graph(0);
- dynamic_properties dp;
- property_map<graph_t, vertex_name_t>::type vname =
- get(vertex_name, graph);
- dp.property("node_id",vname);
- property_map<graph_t, vertex_label_t>::type vlabel =
- get(vertex_label_t(), graph);
- dp.property("label",vlabel);
- property_map<graph_t, vertex_root_t>::type root =
- get(vertex_root, graph);
- dp.property("root",root);
- property_map<graph_t, edge_name_t>::type elabel =
- get(edge_name, graph);
- dp.property("label",elabel);
- // Use ref_property_map to turn a graph property into a property map
- ref_property_map<graph_t*,string>
- gname(get_property(graph,graph_name));
- dp.property("name",gname);
- // Use ref_property_map to turn a graph property into a property map
- ref_property_map<graph_t*,string>
- gid(get_property(graph,graph_identifier_t()));
- dp.property("identifier",gid);
- // Sample graph as an istream;
- const char* dot =
- "digraph \
- { \
- graph [name=\"GRAPH\", identifier=\"CX2A1Z\"] \
- \
- a [label=\"NODE_A\", root=\"1\"] \
- b [label=\"NODE_B\", root=\"0\"] \
- \
- a -> b [label=\"EDGE_1\"] \
- b -> c [label=\"EDGE_2\"] \
- }";
- istringstream gvgraph(dot);
- bool status = read_graphviz(gvgraph,graph,dp,"node_id");
- if (!status) {
- cerr << "read_graphviz() failed." << endl;
- return -1;
- }
- cout << "graph " << get("name",dp,&graph) <<
- " (" << get("identifier",dp,&graph) << ")\n\n";
- BOOST_FOREACH( graph_t::vertex_descriptor v, vertices(graph) ) {
- cout << "vertex " << get("node_id",dp,v) <<
- " (" << get("label",dp,v) << ")\n";
- }
- return 0;
- }
|