Advertisement
Guest User

Untitled

a guest
May 30th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.04 KB | None | 0 0
  1. #include <vector>
  2. #include <cstdint>
  3.  
  4. struct edge_list
  5. {
  6.     typedef std::size_t size_type;
  7.  
  8.     // Node
  9.     struct node
  10.     {
  11.         node( unsigned value, unsigned next ) :
  12.             value( value ),
  13.             next( next )
  14.         {
  15.         }
  16.         size_type value;
  17.         size_type next;
  18.     };
  19.  
  20.     // Resize the list
  21.     void resize( size_type n, size_type data = 0 )
  22.     {
  23.         edges_.resize( n, 0 );
  24.         data_.reserve( data * 2 );
  25.     }
  26.  
  27.     // Add a new edge
  28.     void add_edge( size_type a, size_type b )
  29.     {
  30.         add_edge_internal( a, b );
  31.         add_edge_internal( b, a );
  32.     }
  33.  
  34.     // Each
  35.     template< typename Functor >
  36.     void each( size_type i, Functor fn ) const
  37.     {
  38.         size_type n = edges_[ i ];
  39.         while ( n != 0 )
  40.         {
  41.             const node& ref = data_[ n - 1 ];
  42.             n = ref.next;
  43.             fn( ref.value - 1 );
  44.         }
  45.     }
  46.  
  47. private:
  48.     // Add edge internal
  49.     void add_edge_internal( size_type a, size_type b )
  50.     {
  51.         size_type old_top = edges_[ a ];
  52.         data_.emplace_back( b + 1, old_top );
  53.         edges_[ a ] = data_.size();
  54.     }
  55.  
  56. private:
  57.     std::vector< node >      data_;
  58.     std::vector< size_type > edges_;
  59. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement