visitor.cpp

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

CPP
109
字号
//=======================================================================// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek//// 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)//=======================================================================////  Sample output//// DFS categorized directed graph// tree: 0 --> 2// tree: 2 --> 1// back: 1 --> 1// tree: 1 --> 3// back: 3 --> 1// tree: 3 --> 4// back: 4 --> 0// back: 4 --> 1// forward or cross: 2 --> 3// BFS categorized directed graph// tree: 0 --> 2// tree: 2 --> 1// tree: 2 --> 3// cycle: 1 --> 1// cycle: 1 --> 3// cycle: 3 --> 1// tree: 3 --> 4// cycle: 4 --> 0// cycle: 4 --> 1#include <boost/config.hpp>#include <iostream>#include <vector>#include <algorithm>#include <utility>#include <string>#include <boost/graph/visitors.hpp>#include <boost/graph/graph_utility.hpp>#include <boost/graph/adjacency_list.hpp>#include <boost/graph/breadth_first_search.hpp>#include <boost/graph/depth_first_search.hpp>using namespace boost;using namespace std;template <class Tag>struct edge_printer : public base_visitor<edge_printer<Tag> > {  typedef Tag event_filter;  edge_printer(std::string edge_t) : m_edge_type(edge_t) { }  template <class Edge, class Graph>  void operator()(Edge e, Graph& G) {    std::cout << m_edge_type << ": " << source(e, G)               << " --> " <<  target(e, G) << std::endl;  }  std::string m_edge_type;};template <class Tag>edge_printer<Tag> print_edge(std::string type, Tag) {   return edge_printer<Tag>(type);}int main(int, char*[]){  using namespace boost;    typedef adjacency_list<> Graph;  typedef std::pair<int,int> E;  E edges[] = { E(0, 2),                E(1, 1), E(1, 3),                E(2, 1), E(2, 3),                E(3, 1), E(3, 4),                E(4, 0), E(4, 1) };  #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300  Graph G(5);  for (std::size_t j = 0; j < sizeof(edges)/sizeof(E); ++j)    add_edge(edges[j].first, edges[j].second, G);#else  Graph G(edges, edges + sizeof(edges)/sizeof(E), 5);#endif  typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;  typedef boost::graph_traits<Graph>::vertices_size_type size_type;    std::vector<size_type> d(num_vertices(G));    std::vector<size_type> f(num_vertices(G));  cout << "DFS categorized directed graph" << endl;  depth_first_search(G, visitor(make_dfs_visitor(      make_list(print_edge("tree", on_tree_edge()),                print_edge("back", on_back_edge()),                print_edge("forward or cross", on_forward_or_cross_edge())                ))));  cout << endl << "BFS categorized directed graph" << endl;  boost::breadth_first_search    (G, vertex(0, G), visitor(make_bfs_visitor(     std::make_pair(print_edge("tree", on_tree_edge()),                    print_edge("cycle", on_non_tree_edge())))));  return 0;}

⌨️ 快捷键说明

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