src/work/bfsdemo.cc
author deba
Wed, 08 Sep 2004 12:06:45 +0000
changeset 822 88226d9fe821
parent 6 b63d1bc367f7
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.
     1 #include <iostream>
     2 #include <graph.h>
     3 #include <bfs.h>
     4 
     5 using namespace NEGRO;
     6 using namespace std;
     7 
     8 class IGraph 
     9 {
    10 public:
    11 
    12   //  struct NodeType {bfs_node_data<TestGraph> bfs;};
    13   struct NodeType {bool isVis;};
    14 
    15   vector<NodeType> nodes;
    16   
    17   class NodeIterator 
    18   {
    19   public:
    20     IGraph *G;
    21     int n;
    22     NodeIterator &operator ++() { n++; return *this;}
    23     NodeType &operator *() const { return G->nodes[n];}
    24     NodeType *operator ->() const { return &(G->nodes[n]);}
    25     bool isValid() const {return n<=5000;}
    26     int Index() {return n;} //csak a kiirashoz kell
    27 
    28     NodeIterator() {}
    29     NodeIterator(IGraph &Gr) {G=&Gr;n=1;} //Bfs class prefer this.
    30   };
    31   
    32   void GetFirst(NodeIterator &i) {i.G=this;i.n=1;}
    33 
    34   class OutEdgeIterator 
    35   {    
    36   public:
    37     IGraph *G;
    38     int f,t;
    39     int gcd() { int a=f;int b=t;int c;while((c=a%b)) {a=b;b=c;} ; return b;}
    40     OutEdgeIterator &operator ++() {while(++t<=5000&&gcd()==1);return *this;}
    41     bool isValid() const {return t<=5000;}
    42     NodeIterator From() const {NodeIterator i; i.G=G;i.n=f;return i;}
    43     NodeIterator To() const {NodeIterator i; i.G=G;i.n=t;return i;}
    44     NodeIterator Anode() const {return From();}
    45     NodeIterator Bnode() const {return To();}
    46 
    47     OutEdgeIterator() {}
    48     OutEdgeIterator(IGraph &Gr,NodeIterator &n)  //Bfs class prefer this.
    49     {G=&Gr;f=n.n;t=0;operator++();}
    50   };
    51 
    52   typedef OutEdgeIterator EdgeIterator;
    53   void GetFirst(OutEdgeIterator &i,const NodeIterator &n)
    54   {i.G=this;i.f=n.n;i.t=0;++i;}
    55 
    56   IGraph() : nodes(5001) {}
    57 };
    58 
    59 class IMaps_t
    60 {
    61 public:
    62 //     class_element_map<IGraph::NodeIterator,
    63 //   		    IGraph::NodeType,
    64 //   		    bool,
    65 //   		    &IGraph::NodeType::isVis> visited;
    66   struct _visited_map_t {
    67     typedef bool value_type;
    68     void Put(const IGraph::NodeIterator &n,const value_type &t) { n->isVis=t; }
    69     value_type Get(const IGraph::NodeIterator &n) const { return n->isVis; }
    70     void SetG(IGraph &G) {}
    71   } visited;
    72   struct _tree_map_t {
    73     typedef IGraph::EdgeIterator value_type;
    74     void Put(const IGraph::NodeIterator &n,const value_type &t)
    75     { cout << t.From().Index() << "->" << t.To().Index() << '\n'; }
    76     void SetG(IGraph &G) {}
    77   } tree;
    78   do_nothing_map dist;   //node->int (W)
    79   do_nothing_map priority; //node->int (W)
    80 };
    81 
    82 // New style bfs traits
    83 class BFS_T 
    84 {
    85 public:
    86 
    87   typedef IGraph Graph;
    88   typedef IGraph::OutEdgeIterator SearchEdgeIterator;
    89   
    90   struct visited_map_t {
    91     typedef bool value_type;
    92     void Put(const IGraph::NodeIterator &n,const value_type &t) { n->isVis=t; }
    93     value_type Get(const IGraph::NodeIterator &n) const { return n->isVis; }
    94     void SetG(IGraph &G) {}
    95   };
    96   struct tree_map_t {
    97     typedef IGraph::EdgeIterator value_type;
    98     void Put(const IGraph::NodeIterator &n,const value_type &t)
    99     { cout << t.From().Index() << "->" << t.To().Index() << '\n'; }
   100     void SetG(IGraph &G) {}
   101   };
   102   typedef do_nothing_map dist_map_t;   //node->int (W)
   103   typedef do_nothing_map priority_map_t; //node->int (W)
   104 };
   105 
   106 
   107 int main()
   108 {
   109   IGraph IG;
   110 
   111 //   //Function-syte calling
   112 //   IMaps_t IMaps;
   113 
   114 //   IGraph::NodeIterator in;
   115 //   IG.GetFirst(in);
   116 //   ++in;
   117 //   bfs_fn(IG,in,IMaps);  
   118 
   119   //Class-style calling:
   120   
   121   IGraph::NodeIterator in;
   122   IG.GetFirst(in);
   123   ++in;
   124   Bfs<BFS_T> bfs;
   125   bfs.SetG(IG);
   126   bfs.Init(in);
   127   bfs.Run();
   128 }