graph/example/incremental-components-eg.cpp
Jeremiah Willcock 801a11bf4a Merged in changes from trunk for Boost.Graph and Boost.PropertyMap. Includes
r56013, r56014, r56015, r56016, r56017, r56089, r56097, r56116, r56117, r56126,
r56127, r56128, r56140, r56147, r56300, r56301, r56339, r56360, r56454, r56473,
r56563, r56651, r56654, r56658, r56682, r56732, r56796, r56855, r56856, r56868,
r55667, r56860, r55473, r55507, r55528, r55749, r56147, r55723, r56109, r56859,
and r55780.


[SVN r56881]
2009-10-15 20:40:46 +00:00

85 lines
2.7 KiB
C++

//=======================================================================
// Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
// Copyright 2009 Trustees of Indiana University.
// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Michael Hansen
//
// 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 <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/incremental_components.hpp>
#include <boost/pending/disjoint_sets.hpp>
using namespace boost;
int main(int argc, char* argv[])
{
typedef adjacency_list <vecS, vecS, undirectedS> Graph;
typedef graph_traits<Graph>::vertex_descriptor Vertex;
typedef graph_traits<Graph>::edge_descriptor Edge;
typedef graph_traits<Graph>::vertices_size_type VertexIndex;
// Create a graph
const int VERTEX_COUNT = 6;
Graph graph(VERTEX_COUNT);
add_edge(0, 1, graph);
add_edge(1, 4, graph);
// reate the disjoint-sets object, which requires rank and parent
// vertex properties.
std::vector<Vertex> rank(num_vertices(graph));
std::vector<Vertex> parent(num_vertices(graph));
typedef VertexIndex* Rank;
typedef Vertex* Parent;
disjoint_sets<Rank, Parent> ds(&rank[0], &parent[0]);
// Determine the connected components, storing the results in the
// disjoint-sets object.
initialize_incremental_components(graph, ds);
incremental_components(graph, ds);
// Add a couple more edges and update the disjoint-sets
add_edge(4, 0, graph);
add_edge(2, 5, graph);
ds.union_set(4, 0);
ds.union_set(2, 5);
BOOST_FOREACH(Vertex current_vertex, vertices(graph)) {
std::cout << "representative[" << current_vertex << "] = " <<
ds.find_set(current_vertex) << std::endl;
}
std::cout << std::endl;
// Generate component index. NOTE: We would need to pass in a vertex
// index map into the component_index constructor if our graph type
// used listS instead of vecS (identity_property_map is used by
// default).
typedef component_index<VertexIndex> Components;
Components components(parent.begin(), parent.end());
// Iterate through the component indices
BOOST_FOREACH(VertexIndex component_index, components) {
std::cout << "component " << component_index << " contains: ";
// Iterate through the child vertex indices for [component_index]
BOOST_FOREACH(VertexIndex child_index,
components[component_index]) {
std::cout << child_index << " ";
}
std::cout << std::endl;
}
return (0);
}