src/work/alpar/attic/bfs.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000
changeset 822 88226d9fe821
parent 302 2c52fc9781d4
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
alpar@302
     1
// -*-mode: c++; -*-
alpar@302
     2
#ifndef _BFS_H_
alpar@302
     3
#define _BFS_H_
alpar@302
     4
alpar@302
     5
#include <queue>
alpar@302
     6
#include <graph.h>
alpar@302
     7
alpar@302
     8
namespace NEGRO 
alpar@302
     9
{
alpar@302
    10
  using namespace std;
alpar@302
    11
  
alpar@302
    12
  //   template <typename G,typename> class bfs_T
alpar@302
    13
  //   {
alpar@302
    14
  //     typedef G Graph;
alpar@302
    15
  //     typedef Graph::OutEdgeIterator EdgeIterator; //Ez kell
alpar@302
    16
  //     typedef Graph::NodeIterator NodeIterator;
alpar@302
    17
    
alpar@302
    18
  //     class bfs_node_D 
alpar@302
    19
  //     {
alpar@302
    20
  //       EdgeIterator Tree;
alpar@302
    21
  //       int Dist;
alpar@302
    22
  //       int Priority;
alpar@302
    23
  //     }
alpar@302
    24
  //   }
alpar@302
    25
    
alpar@302
    26
alpar@302
    27
  //     //    template <bfs_T<G>>
alpar@302
    28
  //     //    void bfs(bfs_T::Graph &G,const bfs_T::NodeIterator &start_node,const &maps)
alpar@302
    29
alpar@302
    30
    
alpar@302
    31
  
alpar@302
    32
  //   template <class G>
alpar@302
    33
  //   class bfs_maps_T
alpar@302
    34
  //   {
alpar@302
    35
  //     typedef visited; //node->bool (RW)
alpar@302
    36
  //     typedef tree;    //node->EdgeIterator (W)
alpar@302
    37
  //     typedef dist;   //node->int (W)
alpar@302
    38
  //     typedef priority; //node->int (W)
alpar@302
    39
  //   };
alpar@302
    40
  
alpar@302
    41
  
alpar@302
    42
  //   Nem jo! Osszeakad a masik Put-tal
alpar@302
    43
  //   class do_nothing_map {};
alpar@302
    44
  //   template <typename V,typename T>
alpar@302
    45
  //   void Put(const do_nothing_map &p,const V &v,const T &t) {}
alpar@302
    46
  
alpar@302
    47
  struct do_nothing_map {
alpar@302
    48
    template <typename V,typename T> static void Put(V v,T t) {}
alpar@302
    49
    template <typename G> void SetG(G &g) {}
alpar@302
    50
  };
alpar@302
    51
  
alpar@302
    52
alpar@302
    53
  template <typename I,typename C, typename T, T C::*M>
alpar@302
    54
  class class_element_map {
alpar@302
    55
  public:
alpar@302
    56
    typedef T value_type;
alpar@302
    57
    static void Put(const I &i, const T &t) {(*i).*M=t;}
alpar@302
    58
    static T Get(const I i) {return (*i).*M;}
alpar@302
    59
    T &operator[](I i) {return (*i).*M;}
alpar@302
    60
  };
alpar@302
    61
alpar@302
    62
  /* 
alpar@302
    63
     template <typename C,typename I,typename T, T C::*M>
alpar@302
    64
     void Put(class_element_map<C,T,M> p,I i, T t)
alpar@302
    65
     {
alpar@302
    66
     i->*M=t;   
alpar@302
    67
     };
alpar@302
    68
  */
alpar@302
    69
alpar@302
    70
  template <typename P,typename I,typename T>
alpar@302
    71
  inline void Put(P &p,const I &i, const T &t)
alpar@302
    72
  {
alpar@302
    73
    p.Put(i,t);   
alpar@302
    74
  };
alpar@302
    75
  template <typename P,typename I>
alpar@302
    76
  inline typename P::value_type Get(const P &p,const I &i)
alpar@302
    77
  {
alpar@302
    78
    return p.Get(i);   
alpar@302
    79
  };
alpar@302
    80
alpar@302
    81
  /*
alpar@302
    82
    template <typename G,typename T, typename G::EdgeType::*M>
alpar@302
    83
    T Get(edge_element_map p,G::EdgeIterator i)
alpar@302
    84
    {
alpar@302
    85
    return i->*M;
alpar@302
    86
    };
alpar@302
    87
  */
alpar@302
    88
  
alpar@302
    89
  /* 
alpar@302
    90
     template <class G>
alpar@302
    91
     class default_bfs_maps
alpar@302
    92
     {
alpar@302
    93
     public:
alpar@302
    94
     typedef typename G::NodeType NodeType;
alpar@302
    95
    
alpar@302
    96
     class_element_map<typename G::NodeIterator,
alpar@302
    97
     typename G::NodeType,
alpar@302
    98
     bool,&NodeType::isVis> visited; //node->bool (RW)
alpar@302
    99
     do_nothing_map tree;   //node->EdgeIterator (W)
alpar@302
   100
     do_nothing_map dist;   //node->int (W)
alpar@302
   101
     do_nothing_map priority; //node->int (W)
alpar@302
   102
     };
alpar@302
   103
  */
alpar@302
   104
alpar@302
   105
  template<class G>
alpar@302
   106
  struct bfs_node_data 
alpar@302
   107
  {
alpar@302
   108
    bool visited;
alpar@302
   109
    typename G::EdgeIterator tree;
alpar@302
   110
    int dist;
alpar@302
   111
    int priority;
alpar@302
   112
  };
alpar@302
   113
  
alpar@302
   114
  template <class G>
alpar@302
   115
  class bfs_static_maps
alpar@302
   116
  {
alpar@302
   117
  public:
alpar@302
   118
    typedef typename G::NodeType NodeType;
alpar@302
   119
    
alpar@302
   120
    /*    class_element_map<typename G::NodeIterator,
alpar@302
   121
	  typename G::NodeType,
alpar@302
   122
	  bfs_node_data<G>,&NT::D> n_d; //node-> data
alpar@302
   123
    */
alpar@302
   124
    class 
alpar@302
   125
    {
alpar@302
   126
    public:
alpar@302
   127
      bfs_node_data<G> NodeType::*d;
alpar@302
   128
      typedef bool value_type;
alpar@302
   129
      void Put(typename G::NodeIterator &i, const value_type &t)
alpar@302
   130
      {((*i).*d).visited=t;}
alpar@302
   131
      value_type Get(const typename G::NodeIterator &i) const
alpar@302
   132
      {return ((*i).*d).visited;}
alpar@302
   133
    } visited;
alpar@302
   134
    
alpar@302
   135
    class 
alpar@302
   136
    {
alpar@302
   137
    public:
alpar@302
   138
      bfs_node_data<G> NodeType::*d;
alpar@302
   139
      typedef typename G::EdgeIterator value_type;
alpar@302
   140
      void Put(typename G::NodeIterator &i, const value_type &t)
alpar@302
   141
      {((*i).*d).tree=t;}
alpar@302
   142
      value_type Get(const typename G::NodeIterator &i) const
alpar@302
   143
      {return ((*i).*d).tree;}
alpar@302
   144
    } tree;
alpar@302
   145
    
alpar@302
   146
    class 
alpar@302
   147
    {
alpar@302
   148
    public:
alpar@302
   149
      bfs_node_data<G> NodeType::*d;
alpar@302
   150
      typedef int value_type;
alpar@302
   151
      void Put(typename G::NodeIterator &i, const value_type &t)
alpar@302
   152
      {((*i).*d).dist=t;}
alpar@302
   153
      value_type Get(const typename G::NodeIterator &i) const
alpar@302
   154
      {return ((*i).*d).dist;}
alpar@302
   155
    } dist;
alpar@302
   156
    
alpar@302
   157
    class 
alpar@302
   158
    {
alpar@302
   159
    public:
alpar@302
   160
      bfs_node_data<G> NodeType::*d;
alpar@302
   161
      typedef int value_type;
alpar@302
   162
      void Put(typename G::NodeIterator &i,  const value_type &t)
alpar@302
   163
      {((*i).*d).priority=t;}
alpar@302
   164
      value_type Get(const typename G::NodeIterator &i) const
alpar@302
   165
      {return ((*i).*d).priority;}
alpar@302
   166
    } priority;
alpar@302
   167
    
alpar@302
   168
    //do_nothing_map tree;   //node->EdgeIterator (W)
alpar@302
   169
    //    do_nothing_map dist;   //node->int (W)
alpar@302
   170
    //    do_nothing_map priority; //node->int (W)
alpar@302
   171
alpar@302
   172
    void SetDataField(const bfs_node_data<G> NodeType::*dd)
alpar@302
   173
    {
alpar@302
   174
      tree.d=visited.d=dist.d=priority.d=dd;
alpar@302
   175
    }
alpar@302
   176
    
alpar@302
   177
    bfs_static_maps(const bfs_node_data<G> NodeType::*dd) 
alpar@302
   178
    {
alpar@302
   179
      PutDataField(dd);
alpar@302
   180
    }
alpar@302
   181
    
alpar@302
   182
    bfs_static_maps(const bfs_static_maps<G> &B) 
alpar@302
   183
    {
alpar@302
   184
      tree.d=B.tree.d;visited.d=B.visited.d;
alpar@302
   185
      dist.d=B.dist.d;priority.d=B.priority.d;
alpar@302
   186
    }
alpar@302
   187
    
alpar@302
   188
  };
alpar@302
   189
  
alpar@302
   190
  template<typename I>
alpar@302
   191
  struct BFS_Q
alpar@302
   192
  {
alpar@302
   193
    I n;
alpar@302
   194
    int dist;
alpar@302
   195
    //  BFS_Q() {}
alpar@302
   196
    //  BFS_Q(BFS_Q<I> &b) {n=b.n;dist=b.dist;}
alpar@302
   197
  };
alpar@302
   198
  
alpar@302
   199
  template<class G,class M>
alpar@302
   200
  void bfs_fn(G &Gr,const typename G::NodeIterator &start_node,M &maps)
alpar@302
   201
  {
alpar@302
   202
    using namespace std;
alpar@302
   203
    
alpar@302
   204
    typedef BFS_Q<typename G::NodeIterator> Q_T;
alpar@302
   205
    
alpar@302
   206
    Q_T q;
alpar@302
   207
    
alpar@302
   208
    int pr=0;
alpar@302
   209
    typename G::NodeIterator n,m;
alpar@302
   210
    typename G::OutEdgeIterator e;
alpar@302
   211
    int d;
alpar@302
   212
    
alpar@302
   213
    for(Gr.GetFirst(n);n.isValid();++n)
alpar@302
   214
      Put(maps.visited,n,false);
alpar@302
   215
    
alpar@302
   216
    queue<Q_T> Q;
alpar@302
   217
    
alpar@302
   218
    q.n=start_node;
alpar@302
   219
    q.dist=0;
alpar@302
   220
    Q.push(q);
alpar@302
   221
    Put(maps.visited,start_node,true);
alpar@302
   222
    //      Put(maps::tree,start_node,?????);
alpar@302
   223
    Put(maps.dist,start_node,0);
alpar@302
   224
    Put(maps.priority,start_node,pr++);
alpar@302
   225
    
alpar@302
   226
    do {
alpar@302
   227
      n=Q.front().n;d=Q.front().dist+1;
alpar@302
   228
      Q.pop();
alpar@302
   229
      for(Gr.GetFirst(e,n);e.isValid();++e)
alpar@302
   230
	if(!Get(maps.visited,(m=e.Bnode()))) {
alpar@302
   231
	  q.n=m;
alpar@302
   232
	  q.dist=d;
alpar@302
   233
	  Q.push(q);
alpar@302
   234
	  Put(maps.visited,m,true);
alpar@302
   235
	  Put(maps.tree,m,e);
alpar@302
   236
	  Put(maps.dist,m,d);
alpar@302
   237
	  Put(maps.priority,m,pr++);
alpar@302
   238
	}
alpar@302
   239
    } while(!Q.empty());
alpar@302
   240
  };
alpar@302
   241
alpar@302
   242
  // bfs algorithm class
alpar@302
   243
alpar@302
   244
  template<class G>  //the default traits
alpar@302
   245
  class default_bfs_T
alpar@302
   246
  {
alpar@302
   247
  public:
alpar@302
   248
    
alpar@302
   249
    typedef G Graph;
alpar@302
   250
    typedef typename G::OutEdgeIterator SearchEdgeIterator;
alpar@302
   251
    
alpar@302
   252
    typedef typename G::NodeMap<bool> visited_map_t;
alpar@302
   253
    typedef typename G::NodeMap<typename G::EdgeIterator> tree_map_t;
alpar@302
   254
    
alpar@302
   255
    typedef typename G::NodeMap<int> dist_map_t;   //node->int (W)
alpar@302
   256
    typedef typename G::NodeMap<int> priority_map_t; //node->int (W)
alpar@302
   257
};
alpar@302
   258
alpar@302
   259
  template<class T>
alpar@302
   260
  class Bfs
alpar@302
   261
  {
alpar@302
   262
  public:
alpar@302
   263
    typedef typename T::Graph Graph;
alpar@302
   264
    typedef typename Graph::NodeIterator NodeIterator;
alpar@302
   265
    typedef typename Graph::EdgeIterator EdgeIterator;
alpar@302
   266
    
alpar@302
   267
    typedef typename T::SearchEdgeIterator SearchEdgeIterator;
alpar@302
   268
    
alpar@302
   269
    typename T::visited_map_t visited_map;
alpar@302
   270
    typename T::tree_map_t tree_map;
alpar@302
   271
    typename T::dist_map_t dist_map;
alpar@302
   272
    typename T::priority_map_t priority_map;
alpar@302
   273
    
alpar@302
   274
    struct bfs_queue_cont
alpar@302
   275
    {
alpar@302
   276
      NodeIterator n;
alpar@302
   277
      int dist;
alpar@302
   278
    };
alpar@302
   279
    
alpar@302
   280
    std::queue<bfs_queue_cont> bfs_queue;
alpar@302
   281
    
alpar@302
   282
    int priority;
alpar@302
   283
    Graph *G;
alpar@302
   284
    
alpar@302
   285
    //Bfs(int i): visited_map(G), tree_map(G), dist_map(G), priority_map(G) {}
alpar@302
   286
    Bfs() {}
alpar@302
   287
alpar@302
   288
    void SetG(Graph &Gr)
alpar@302
   289
    {
alpar@302
   290
      G=&Gr;
alpar@302
   291
      visited_map.SetG(Gr);
alpar@302
   292
      tree_map.SetG(Gr);
alpar@302
   293
      dist_map.SetG(Gr);
alpar@302
   294
      priority_map.SetG(Gr);
alpar@302
   295
    }
alpar@302
   296
    
alpar@302
   297
    void Init()
alpar@302
   298
    {
alpar@302
   299
      //There must be a better way to do this:
alpar@302
   300
      while(!bfs_queue.empty()) bfs_queue.pop();
alpar@302
   301
alpar@302
   302
      for(NodeIterator n(*G);n.isValid();++n)
alpar@302
   303
	Put(visited_map,n,false);
alpar@302
   304
      
alpar@302
   305
      priority=0;
alpar@302
   306
    }
alpar@302
   307
    
alpar@302
   308
    void AddStartNode(const NodeIterator &start_node,int dist=0)
alpar@302
   309
    {
alpar@302
   310
      bfs_queue_cont q;
alpar@302
   311
      q.n=start_node;
alpar@302
   312
      q.dist=dist;
alpar@302
   313
      bfs_queue.push(q);
alpar@302
   314
alpar@302
   315
      Put(visited_map,start_node,true);
alpar@302
   316
      //      Put(tree_map,start_node,?????);
alpar@302
   317
      Put(dist_map,start_node,dist);
alpar@302
   318
      Put(priority_map,start_node,priority++);    
alpar@302
   319
    }
alpar@302
   320
    
alpar@302
   321
    void Init(const NodeIterator &start_node,int dist=0)
alpar@302
   322
    {
alpar@302
   323
      Init();
alpar@302
   324
      AddStartNode(start_node,dist);
alpar@302
   325
    }
alpar@302
   326
alpar@302
   327
    void Run() 
alpar@302
   328
    {
alpar@302
   329
      NodeIterator n,m;
alpar@302
   330
      int d;
alpar@302
   331
alpar@302
   332
      bfs_queue_cont q;
alpar@302
   333
      while(!(bfs_queue.empty()/* && other stop conditions */)) {
alpar@302
   334
	n=bfs_queue.front().n;d=bfs_queue.front().dist+1;
alpar@302
   335
	bfs_queue.pop();
alpar@302
   336
	for(SearchEdgeIterator e(*G,n);e.isValid();++e)
alpar@302
   337
	  if(!Get(visited_map,(m=e.Bnode()))) {
alpar@302
   338
	    q.n=m;
alpar@302
   339
	    q.dist=d;
alpar@302
   340
	    bfs_queue.push(q);
alpar@302
   341
	    Put(visited_map,m,true);
alpar@302
   342
	    Put(tree_map,m,e);
alpar@302
   343
	    Put(dist_map,m,d);
alpar@302
   344
	    Put(priority_map,m,priority++);
alpar@302
   345
	  }
alpar@302
   346
      }
alpar@302
   347
    }
alpar@302
   348
  };
alpar@302
   349
  
alpar@302
   350
}
alpar@302
   351
  
alpar@302
   352
#endif