| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | //=======================================================================// Copyright 2007 Aaron Windsor//// 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)//=======================================================================#ifndef __MAKE_BICONNECTED_PLANAR_HPP__#define __MAKE_BICONNECTED_PLANAR_HPP__#include <boost/config.hpp>#include <boost/tuple/tuple.hpp> //for tie#include <boost/graph/biconnected_components.hpp>#include <boost/property_map/property_map.hpp>#include <vector>#include <iterator>#include <algorithm>#include <boost/graph/planar_detail/add_edge_visitors.hpp>namespace boost{template < typename Graph, typename PlanarEmbedding, typename EdgeIndexMap,    typename AddEdgeVisitor >void make_biconnected_planar(    Graph& g, PlanarEmbedding embedding, EdgeIndexMap em, AddEdgeVisitor& vis){    typedef typename graph_traits< Graph >::vertex_descriptor vertex_t;    typedef typename graph_traits< Graph >::edge_descriptor edge_t;    typedef typename graph_traits< Graph >::edges_size_type edge_size_t;    typedef typename property_traits< PlanarEmbedding >::value_type        embedding_value_t;    typedef typename embedding_value_t::const_iterator embedding_iterator_t;    typedef iterator_property_map< std::vector< std::size_t >::iterator,        EdgeIndexMap >        component_map_t;    edge_size_t n_edges(num_edges(g));    std::vector< vertex_t > articulation_points;    std::vector< edge_size_t > component_vector(n_edges);    component_map_t component_map(component_vector.begin(), em);    biconnected_components(        g, component_map, std::back_inserter(articulation_points));    typename std::vector< vertex_t >::iterator ap, ap_end;    ap_end = articulation_points.end();    for (ap = articulation_points.begin(); ap != ap_end; ++ap)    {        vertex_t v(*ap);        embedding_iterator_t pi = embedding[v].begin();        embedding_iterator_t pi_end = embedding[v].end();        edge_size_t previous_component(n_edges + 1);        vertex_t previous_vertex = graph_traits< Graph >::null_vertex();        for (; pi != pi_end; ++pi)        {            edge_t e(*pi);            vertex_t e_source(source(e, g));            vertex_t e_target(target(e, g));            // Skip self-loops and parallel edges            if (e_source == e_target || previous_vertex == e_target)                continue;            vertex_t current_vertex = e_source == v ? e_target : e_source;            edge_size_t current_component = component_map[e];            if (previous_vertex != graph_traits< Graph >::null_vertex()                && current_component != previous_component)            {                vis.visit_vertex_pair(current_vertex, previous_vertex, g);            }            previous_vertex = current_vertex;            previous_component = current_component;        }    }}template < typename Graph, typename PlanarEmbedding, typename EdgeIndexMap >inline void make_biconnected_planar(    Graph& g, PlanarEmbedding embedding, EdgeIndexMap em){    default_add_edge_visitor vis;    make_biconnected_planar(g, embedding, em, vis);}template < typename Graph, typename PlanarEmbedding >inline void make_biconnected_planar(Graph& g, PlanarEmbedding embedding){    make_biconnected_planar(g, embedding, get(edge_index, g));}} // namespace boost#endif //__MAKE_BICONNECTED_PLANAR_HPP__
 |