ossrv_pub/boost_apis/boost/graph/topological_sort.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 //
       
     2 //=======================================================================
       
     3 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
       
     4 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
       
     5 //
       
     6 // Distributed under the Boost Software License, Version 1.0. (See
       
     7 // accompanying file LICENSE_1_0.txt or copy at
       
     8 // http://www.boost.org/LICENSE_1_0.txt)
       
     9 //=======================================================================
       
    10 //
       
    11 #ifndef BOOST_GRAPH_TOPOLOGICAL_SORT_HPP
       
    12 #define BOOST_GRAPH_TOPOLOGICAL_SORT_HPP
       
    13 
       
    14 #include <boost/config.hpp>
       
    15 #include <boost/property_map.hpp>
       
    16 #include <boost/graph/depth_first_search.hpp>
       
    17 #include <boost/graph/visitors.hpp>
       
    18 #include <boost/graph/exception.hpp>
       
    19 
       
    20 namespace boost { 
       
    21 
       
    22 
       
    23   // Topological sort visitor
       
    24   //
       
    25   // This visitor merely writes the linear ordering into an
       
    26   // OutputIterator. The OutputIterator could be something like an
       
    27   // ostream_iterator, or it could be a back/front_insert_iterator.
       
    28   // Note that if it is a back_insert_iterator, the recorded order is
       
    29   // the reverse topological order. On the other hand, if it is a
       
    30   // front_insert_iterator, the recorded order is the topological
       
    31   // order.
       
    32   //
       
    33   template <typename OutputIterator>
       
    34   struct topo_sort_visitor : public dfs_visitor<>
       
    35   {
       
    36     topo_sort_visitor(OutputIterator _iter)
       
    37       : m_iter(_iter) { }
       
    38     
       
    39     template <typename Edge, typename Graph>
       
    40     void back_edge(const Edge& u, Graph&) { throw not_a_dag(); }
       
    41     
       
    42     template <typename Vertex, typename Graph> 
       
    43     void finish_vertex(const Vertex& u, Graph&) { *m_iter++ = u; }
       
    44     
       
    45     OutputIterator m_iter;
       
    46   };
       
    47 
       
    48 
       
    49   // Topological Sort
       
    50   //
       
    51   // The topological sort algorithm creates a linear ordering
       
    52   // of the vertices such that if edge (u,v) appears in the graph,
       
    53   // then u comes before v in the ordering. The graph must
       
    54   // be a directed acyclic graph (DAG). The implementation
       
    55   // consists mainly of a call to depth-first search.
       
    56   //
       
    57 
       
    58   template <typename VertexListGraph, typename OutputIterator,
       
    59     typename P, typename T, typename R>
       
    60   void topological_sort(VertexListGraph& g, OutputIterator result,
       
    61                         const bgl_named_params<P, T, R>& params)
       
    62   {
       
    63     typedef topo_sort_visitor<OutputIterator> TopoVisitor;
       
    64     depth_first_search(g, params.visitor(TopoVisitor(result)));
       
    65   }
       
    66 
       
    67   template <typename VertexListGraph, typename OutputIterator>
       
    68   void topological_sort(VertexListGraph& g, OutputIterator result)
       
    69   {
       
    70     topological_sort(g, result, 
       
    71                      bgl_named_params<int, buffer_param_t>(0)); // bogus
       
    72   }
       
    73 
       
    74 } // namespace boost
       
    75 
       
    76 #endif /*BOOST_GRAPH_TOPOLOGICAL_SORT_H*/