//======================================================================= // 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 #include #include #include #include #include using namespace boost; int main(int argc, char* argv[]) { typedef adjacency_list Graph; typedef graph_traits::vertex_descriptor Vertex; typedef graph_traits::edge_descriptor Edge; typedef graph_traits::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 rank(num_vertices(graph)); std::vector parent(num_vertices(graph)); typedef VertexIndex* Rank; typedef Vertex* Parent; disjoint_sets 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 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); }