1
// (C) Copyright Andrew Sutton 2007
3
// Use, modification and distribution are subject to the
4
// Boost Software License, Version 1.0 (See accompanying file
5
// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
7
//[closeness_centrality_example
11
#include <boost/graph/undirected_graph.hpp>
12
#include <boost/graph/exterior_property.hpp>
13
#include <boost/graph/floyd_warshall_shortest.hpp>
14
#include <boost/graph/closeness_centrality.hpp>
15
#include <boost/graph/property_maps/constant_property_map.hpp>
19
using namespace boost;
21
// The Actor type stores the name of each vertex in the graph.
27
// Declare the graph type and its vertex and edge types.
28
typedef undirected_graph<Actor> Graph;
29
typedef graph_traits<Graph>::vertex_descriptor Vertex;
30
typedef graph_traits<Graph>::edge_descriptor Edge;
32
// The name map provides an abstract accessor for the names of
33
// each vertex. This is used during graph creation.
34
typedef property_map<Graph, string Actor::*>::type NameMap;
36
// Declare a matrix type and its corresponding property map that
37
// will contain the distances between each pair of vertices.
38
typedef exterior_vertex_property<Graph, int> DistanceProperty;
39
typedef DistanceProperty::matrix_type DistanceMatrix;
40
typedef DistanceProperty::matrix_map_type DistanceMatrixMap;
42
// Declare the weight map so that each edge returns the same value.
43
typedef constant_property_map<Edge, int> WeightMap;
45
// Declare a container and its corresponding property map that
46
// will contain the resulting closeness centralities of each
47
// vertex in the graph.
48
typedef boost::exterior_vertex_property<Graph, float> ClosenessProperty;
49
typedef ClosenessProperty::container_type ClosenessContainer;
50
typedef ClosenessProperty::map_type ClosenessMap;
53
main(int argc, char *argv[])
55
// Create the graph and a property map that provides access to[
58
NameMap nm(get(&Actor::name, g));
60
// Read the graph from standard input.
61
read_graph(g, nm, cin);
63
// Compute the distances between all pairs of vertices using
64
// the Floyd-Warshall algorithm. Note that the weight map is
65
// created so that every edge has a weight of 1.
66
DistanceMatrix distances(num_vertices(g));
67
DistanceMatrixMap dm(distances, g);
69
floyd_warshall_all_pairs_shortest_paths(g, dm, weight_map(wm));
71
// Compute the closeness centrality for graph.
72
ClosenessContainer cents(num_vertices(g));
73
ClosenessMap cm(cents, g);
74
all_closeness_centralities(g, dm, cm);
76
// Print the closeness centrality of each vertex.
77
graph_traits<Graph>::vertex_iterator i, end;
78
for(boost::tie(i, end) = vertices(g); i != end; ++i) {
79
cout << setw(12) << setiosflags(ios::left)
80
<< g[*i].name << get(cm, *i) << endl;