Chris@16: //======================================================================= Chris@16: // Copyright 2007 Aaron Windsor Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: //======================================================================= Chris@16: #ifndef __MAKE_CONNECTED_HPP__ Chris@16: #define __MAKE_CONNECTED_HPP__ Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include //for tie Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: Chris@16: template Chris@16: void make_connected(Graph& g, VertexIndexMap vm, AddEdgeVisitor& vis) Chris@16: { Chris@16: typedef typename graph_traits::vertex_iterator vertex_iterator_t; Chris@16: typedef typename graph_traits::vertex_descriptor vertex_t; Chris@16: typedef typename graph_traits::vertices_size_type v_size_t; Chris@16: typedef iterator_property_map< typename std::vector::iterator, Chris@16: VertexIndexMap Chris@16: > vertex_to_v_size_map_t; Chris@16: Chris@16: std::vector component_vector(num_vertices(g)); Chris@16: vertex_to_v_size_map_t component(component_vector.begin(), vm); Chris@16: std::vector vertices_by_component(num_vertices(g)); Chris@16: Chris@16: v_size_t num_components = connected_components(g, component); Chris@16: Chris@16: if (num_components < 2) Chris@16: return; Chris@16: Chris@16: vertex_iterator_t vi, vi_end; Chris@16: boost::tie(vi,vi_end) = vertices(g); Chris@16: std::copy(vi, vi_end, vertices_by_component.begin()); Chris@16: Chris@16: bucket_sort(vertices_by_component.begin(), Chris@16: vertices_by_component.end(), Chris@16: component, Chris@16: num_components Chris@16: ); Chris@16: Chris@16: typedef typename std::vector::iterator vec_of_vertices_itr_t; Chris@16: Chris@16: vec_of_vertices_itr_t ci_end = vertices_by_component.end(); Chris@16: vec_of_vertices_itr_t ci_prev = vertices_by_component.begin(); Chris@16: if (ci_prev == ci_end) Chris@16: return; Chris@16: Chris@16: for(vec_of_vertices_itr_t ci = boost::next(ci_prev); Chris@16: ci != ci_end; ci_prev = ci, ++ci Chris@16: ) Chris@16: { Chris@16: if (component[*ci_prev] != component[*ci]) Chris@16: vis.visit_vertex_pair(*ci_prev, *ci, g); Chris@16: } Chris@16: Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: inline void make_connected(Graph& g, VertexIndexMap vm) Chris@16: { Chris@16: default_add_edge_visitor vis; Chris@16: make_connected(g, vm, vis); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: inline void make_connected(Graph& g) Chris@16: { Chris@16: make_connected(g, get(vertex_index,g)); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif //__MAKE_CONNECTED_HPP__