make_maximal_planar_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 174 行
CPP
174 行
//=======================================================================// 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)//=======================================================================#include <boost/graph/adjacency_list.hpp>#include <boost/graph/properties.hpp>#include <boost/graph/make_maximal_planar.hpp>#include <boost/graph/boyer_myrvold_planar_test.hpp>#include <boost/property_map.hpp>#include <boost/vector_property_map.hpp>#include <boost/test/minimal.hpp>using namespace boost;template <typename Graph>void reset_edge_index(Graph& g){ typename property_map<Graph, edge_index_t>::type index = get(edge_index, g); typename graph_traits<Graph>::edge_iterator ei, ei_end; typename graph_traits<Graph>::edges_size_type cnt = 0; for(tie(ei,ei_end) = edges(g); ei != ei_end; ++ei) put(index, *ei, cnt++);}template <typename Graph>void make_cycle(Graph& g, int size){ typedef typename graph_traits<Graph>::vertex_descriptor vertex_t; vertex_t first_vertex = add_vertex(g); vertex_t prev_vertex = first_vertex; for(int i = 1; i < size; ++i) { vertex_t curr_vertex = add_vertex(g); add_edge(curr_vertex, prev_vertex, g); prev_vertex = curr_vertex; } add_edge(first_vertex, prev_vertex, g);}struct UpdateVertexIndex{ template <typename Graph> void update(Graph& g) { typename property_map<Graph, vertex_index_t>::type index = get(vertex_index, g); typename graph_traits<Graph>::vertex_iterator vi, vi_end; typename graph_traits<Graph>::vertices_size_type cnt = 0; for(tie(vi,vi_end) = vertices(g); vi != vi_end; ++vi) put(index, *vi, cnt++); }};struct NoVertexIndexUpdater{ template <typename Graph> void update(Graph& g) {}};template <typename Graph, typename VertexIndexUpdater>void test_cycle(VertexIndexUpdater vertex_index_updater, int size){ Graph g; make_cycle(g, size); vertex_index_updater.update(g); reset_edge_index(g); typedef std::vector< typename graph_traits<Graph>::edge_descriptor > edge_vector_t; typedef std::vector< edge_vector_t > embedding_storage_t; typedef iterator_property_map < typename embedding_storage_t::iterator, typename property_map<Graph, vertex_index_t>::type > embedding_t; embedding_storage_t embedding_storage(num_vertices(g)); embedding_t embedding(embedding_storage.begin(), get(vertex_index, g)); typename graph_traits<Graph>::vertex_iterator vi, vi_end; for(tie(vi,vi_end) = vertices(g); vi != vi_end; ++vi) std::copy(out_edges(*vi,g).first, out_edges(*vi,g).second, std::back_inserter(embedding[*vi])); BOOST_CHECK(boyer_myrvold_planarity_test(g)); make_maximal_planar(g, embedding); reset_edge_index(g); // A graph is maximal planar exactly when it's both // planar and has 3 * num_vertices(g) - 6 edges. BOOST_CHECK(num_edges(g) == 3 * num_vertices(g) - 6); BOOST_CHECK(boyer_myrvold_planarity_test(g));}int test_main(int, char* []){ typedef adjacency_list <vecS, vecS, undirectedS, property<vertex_index_t, int>, property<edge_index_t, int> > VVgraph_t; typedef adjacency_list <vecS, listS, undirectedS, property<vertex_index_t, int>, property<edge_index_t, int> > VLgraph_t; typedef adjacency_list <listS, vecS, undirectedS, property<vertex_index_t, int>, property<edge_index_t, int> > LVgraph_t; typedef adjacency_list <listS, listS, undirectedS, property<vertex_index_t, int>, property<edge_index_t, int> > LLgraph_t; typedef adjacency_list <setS, setS, undirectedS, property<vertex_index_t, int>, property<edge_index_t, int> > SSgraph_t; test_cycle<VVgraph_t>(NoVertexIndexUpdater(), 10); test_cycle<VVgraph_t>(NoVertexIndexUpdater(), 50); test_cycle<VLgraph_t>(UpdateVertexIndex(), 3); test_cycle<VLgraph_t>(UpdateVertexIndex(), 30); test_cycle<LVgraph_t>(NoVertexIndexUpdater(), 15); test_cycle<LVgraph_t>(NoVertexIndexUpdater(), 45); test_cycle<LLgraph_t>(UpdateVertexIndex(), 8); test_cycle<LLgraph_t>(UpdateVertexIndex(), 19); test_cycle<SSgraph_t>(UpdateVertexIndex(), 13); test_cycle<SSgraph_t>(UpdateVertexIndex(), 20); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?