basic_planarity_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 260 行

CPP
260
字号
//=======================================================================// 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/boyer_myrvold_planar_test.hpp>#include <boost/property_map.hpp>#include <boost/vector_property_map.hpp>#include <boost/test/minimal.hpp>using namespace boost;struct VertexIndexUpdater{  template <typename Graph>  void reset(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 reset(Graph& g) {}};template <typename Graph, typename VertexIndexUpdater>void test_K_5(VertexIndexUpdater vertex_index){  typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;  Graph g;  vertex_t v1 = add_vertex(g);  vertex_t v2 = add_vertex(g);  vertex_t v3 = add_vertex(g);  vertex_t v4 = add_vertex(g);  vertex_t v5 = add_vertex(g);  vertex_index.reset(g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v2, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v3, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v4, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v5, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v2, v3, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v2, v4, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v2, v5, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v3, v4, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v3, v5, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));    //This edge should make the graph non-planar  add_edge(v4, v5, g);  BOOST_CHECK(!boyer_myrvold_planarity_test(g));}template <typename Graph, typename VertexIndexUpdater>void test_K_3_3(VertexIndexUpdater vertex_index){  typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;  Graph g;  vertex_t v1 = add_vertex(g);  vertex_t v2 = add_vertex(g);  vertex_t v3 = add_vertex(g);  vertex_t v4 = add_vertex(g);  vertex_t v5 = add_vertex(g);  vertex_t v6 = add_vertex(g);  vertex_index.reset(g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v4, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v5, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v1, v6, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v2, v4, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v2, v5, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v2, v6, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v3, v4, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  add_edge(v3, v5, g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));    //This edge should make the graph non-planar  add_edge(v3, v6, g);  BOOST_CHECK(!boyer_myrvold_planarity_test(g));}// This test creates a maximal planar graph on num_vertices vertices,// then, if num_vertices is at least 5, adds an additional edge to// create a non-planar graph.template <typename Graph, typename VertexIndexUpdater>void test_maximal_planar(VertexIndexUpdater vertex_index, std::size_t num_vertices){  typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;  Graph g;  std::vector<vertex_t> vmap;  for(std::size_t i = 0; i < num_vertices; ++i)    vmap.push_back(add_vertex(g));  vertex_index.reset(g);  BOOST_CHECK(boyer_myrvold_planarity_test(g));  //create a cycle  for(std::size_t i = 0; i < num_vertices; ++i)    {      add_edge(vmap[i], vmap[(i+1) % num_vertices], g);      BOOST_CHECK(boyer_myrvold_planarity_test(g));    }  //triangulate the interior of the cycle.  for(std::size_t i = 2; i < num_vertices - 1; ++i)    {      add_edge(vmap[0], vmap[i], g);      BOOST_CHECK(boyer_myrvold_planarity_test(g));    }  //triangulate the exterior of the cycle.  for(std::size_t i = 3; i < num_vertices; ++i)    {      add_edge(vmap[1], vmap[i], g);      BOOST_CHECK(boyer_myrvold_planarity_test(g));    }  //Now add an additional edge, forcing the graph to be non-planar.  if (num_vertices > 4)    {      add_edge(vmap[2], vmap[4], g);      BOOST_CHECK(!boyer_myrvold_planarity_test(g));          }}int test_main(int, char* []){  typedef adjacency_list     <vecS,     vecS,     undirectedS,    property<vertex_index_t, int>    >     VVgraph_t;    typedef adjacency_list     <vecS,     listS,     undirectedS,    property<vertex_index_t, int>    >     VLgraph_t;  typedef adjacency_list    <listS,     vecS,     undirectedS,    property<vertex_index_t, int>    >     LVgraph_t;  typedef adjacency_list     <listS,     listS,     undirectedS,    property<vertex_index_t, int>    >     LLgraph_t;  typedef adjacency_list     <setS,     setS,     undirectedS,    property<vertex_index_t, int>    >     SSgraph_t;  test_K_5<VVgraph_t>(NoVertexIndexUpdater());  test_K_3_3<VVgraph_t>(NoVertexIndexUpdater());  test_maximal_planar<VVgraph_t>(NoVertexIndexUpdater(), 3);  test_maximal_planar<VVgraph_t>(NoVertexIndexUpdater(), 6);  test_maximal_planar<VVgraph_t>(NoVertexIndexUpdater(), 10);  test_maximal_planar<VVgraph_t>(NoVertexIndexUpdater(), 20);  test_maximal_planar<VVgraph_t>(NoVertexIndexUpdater(), 50);  test_K_5<VLgraph_t>(VertexIndexUpdater());  test_K_3_3<VLgraph_t>(VertexIndexUpdater());  test_maximal_planar<VLgraph_t>(VertexIndexUpdater(), 3);  test_maximal_planar<VLgraph_t>(VertexIndexUpdater(), 6);  test_maximal_planar<VLgraph_t>(VertexIndexUpdater(), 10);  test_maximal_planar<VLgraph_t>(VertexIndexUpdater(), 20);  test_maximal_planar<VLgraph_t>(VertexIndexUpdater(), 50);    test_K_5<LVgraph_t>(NoVertexIndexUpdater());  test_K_3_3<LVgraph_t>(NoVertexIndexUpdater());  test_maximal_planar<LVgraph_t>(NoVertexIndexUpdater(), 3);  test_maximal_planar<LVgraph_t>(NoVertexIndexUpdater(), 6);  test_maximal_planar<LVgraph_t>(NoVertexIndexUpdater(), 10);  test_maximal_planar<LVgraph_t>(NoVertexIndexUpdater(), 20);  test_maximal_planar<LVgraph_t>(NoVertexIndexUpdater(), 50);  test_K_5<LLgraph_t>(VertexIndexUpdater());  test_K_3_3<LLgraph_t>(VertexIndexUpdater());  test_maximal_planar<LLgraph_t>(VertexIndexUpdater(), 3);  test_maximal_planar<LLgraph_t>(VertexIndexUpdater(), 6);  test_maximal_planar<LLgraph_t>(VertexIndexUpdater(), 10);  test_maximal_planar<LLgraph_t>(VertexIndexUpdater(), 20);  test_maximal_planar<LLgraph_t>(VertexIndexUpdater(), 50);  test_K_5<SSgraph_t>(VertexIndexUpdater());  test_K_3_3<SSgraph_t>(VertexIndexUpdater());  test_maximal_planar<SSgraph_t>(VertexIndexUpdater(), 3);  test_maximal_planar<SSgraph_t>(VertexIndexUpdater(), 6);  test_maximal_planar<SSgraph_t>(VertexIndexUpdater(), 10);  test_maximal_planar<SSgraph_t>(VertexIndexUpdater(), 20);  test_maximal_planar<SSgraph_t>(VertexIndexUpdater(), 50);  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?