src/work/bfsdemo.cc
changeset 1365 c280de819a73
parent 6 b63d1bc367f7
equal deleted inserted replaced
3:5bd2dd77afaa -1:000000000000
     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 }