123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- //=======================================================================
- // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
- // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
- //
- // Distributed under 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)
- //=======================================================================
- #include <boost/config.hpp>
- #include <iostream>
- #include <algorithm>
- #include <boost/graph/adjacency_list.hpp>
- #include <boost/property_map/property_map.hpp>
- #include <string>
- using namespace std;
- using namespace boost;
- /*
- Interior Property Map Basics
- An interior property map is a way of associating properties
- with the vertices or edges of a graph. The "interior" part means
- that the properties are stored inside the graph object. This can be
- convenient when the need for the properties is somewhat permanent,
- and when the properties will be with a graph for the duration of its
- lifetime. A "distance from source vertex" property is often of this
- kind.
- Sample Output
- Jeremy owes Rich some money
- Jeremy owes Andrew some money
- Jeremy owes Jeff some money
- Jeremy owes Kinis some money
- Andrew owes Jeremy some money
- Andrew owes Kinis some money
- Jeff owes Jeremy some money
- Jeff owes Rich some money
- Jeff owes Kinis some money
- Kinis owes Jeremy some money
- Kinis owes Rich some money
- */
- // create a tag for our new property
- enum vertex_first_name_t { vertex_first_name };
- namespace boost {
- BOOST_INSTALL_PROPERTY(vertex, first_name);
- }
- template <class EdgeIter, class Graph>
- void who_owes_who(EdgeIter first, EdgeIter last, const Graph& G)
- {
- // Access the propety acessor type for this graph
- typedef typename property_map<Graph, vertex_first_name_t>
- ::const_type NamePA;
- NamePA name = get(vertex_first_name, G);
- typedef typename boost::property_traits<NamePA>::value_type NameType;
- NameType src_name, targ_name;
- while (first != last) {
- src_name = boost::get(name, source(*first,G));
- targ_name = boost::get(name, target(*first,G));
- cout << src_name << " owes "
- << targ_name << " some money" << endl;
- ++first;
- }
- }
- int
- main()
- {
- {
- // Create the graph, and specify that we will use std::string to
- // store the first name's.
- typedef adjacency_list<vecS, vecS, directedS,
- property<vertex_first_name_t, std::string> > MyGraphType;
-
- typedef pair<int,int> Pair;
- Pair edge_array[11] = { Pair(0,1), Pair(0,2), Pair(0,3), Pair(0,4),
- Pair(2,0), Pair(3,0), Pair(2,4), Pair(3,1),
- Pair(3,4), Pair(4,0), Pair(4,1) };
-
- MyGraphType G(5);
- for (int i=0; i<11; ++i)
- add_edge(edge_array[i].first, edge_array[i].second, G);
- property_map<MyGraphType, vertex_first_name_t>::type name
- = get(vertex_first_name, G);
-
- boost::put(name, 0, "Jeremy");
- boost::put(name, 1, "Rich");
- boost::put(name, 2, "Andrew");
- boost::put(name, 3, "Jeff");
- name[4] = "Kinis"; // you can use operator[] too
-
- who_owes_who(edges(G).first, edges(G).second, G);
- }
- cout << endl;
- return 0;
- }
|