Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <cstdint>
- struct edge_list
- {
- typedef std::size_t size_type;
- // Node
- struct node
- {
- node( unsigned value, unsigned next ) :
- value( value ),
- next( next )
- {
- }
- size_type value;
- size_type next;
- };
- // Resize the list
- void resize( size_type n, size_type data = 0 )
- {
- edges_.resize( n, 0 );
- data_.reserve( data * 2 );
- }
- // Add a new edge
- void add_edge( size_type a, size_type b )
- {
- add_edge_internal( a, b );
- add_edge_internal( b, a );
- }
- // Each
- template< typename Functor >
- void each( size_type i, Functor fn ) const
- {
- size_type n = edges_[ i ];
- while ( n != 0 )
- {
- const node& ref = data_[ n - 1 ];
- n = ref.next;
- fn( ref.value - 1 );
- }
- }
- private:
- // Add edge internal
- void add_edge_internal( size_type a, size_type b )
- {
- size_type old_top = edges_[ a ];
- data_.emplace_back( b + 1, old_top );
- edges_[ a ] = data_.size();
- }
- private:
- std::vector< node > data_;
- std::vector< size_type > edges_;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement