src/work/bfsdemo.cc
author alpar
Sat, 13 Dec 2003 15:44:50 +0000
changeset 3 272a5677bd6d
child 4 8009bb5ddd09
permissions -rw-r--r--
- Marci type iterator constructors
- src/demo/bfsdemo.cc: demo for bfs.h
- cosmetical changes
     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   
    29   void GetFirst(NodeIterator &i) {i.G=this;i.n=1;}
    30 
    31   class OutEdgeIterator 
    32   {    
    33   public:
    34     IGraph *G;
    35     int f,t;
    36     int gcd() { int a=f;int b=t;int c;while((c=a%b)) {a=b;b=c;} ; return b;}
    37     OutEdgeIterator &operator ++() {while(++t<=5000&&gcd()==1);return *this;}
    38     bool isValid() const {return t<=5000;}
    39     NodeIterator From() const {NodeIterator i; i.G=G;i.n=f;return i;}
    40     NodeIterator To() const {NodeIterator i; i.G=G;i.n=t;return i;}
    41     NodeIterator Anode() const {return From();}
    42     NodeIterator Bnode() const {return To();}
    43   };
    44 
    45   typedef OutEdgeIterator EdgeIterator;
    46   void GetFirst(OutEdgeIterator &i,const NodeIterator &n)
    47   {i.G=this;i.f=n.n;i.t=0;++i;}
    48 
    49   IGraph() : nodes(5001) {}
    50 };
    51 
    52 class IMaps_t
    53 {
    54 public:
    55 //     class_element_map<IGraph::NodeIterator,
    56 //   		    IGraph::NodeType,
    57 //   		    bool,
    58 //   		    &IGraph::NodeType::isVis> visited;
    59   struct _visited_map_t {
    60     typedef bool value_type;
    61     void Put(const IGraph::NodeIterator &n,const value_type &t) { n->isVis=t; }
    62     value_type Get(const IGraph::NodeIterator &n) const { return n->isVis; }
    63   } visited;
    64   struct _tree_map_t {
    65     typedef IGraph::EdgeIterator value_type;
    66     void Put(const IGraph::NodeIterator &n,const value_type &t)
    67     { cout << t.From().Index() << "->" << t.To().Index() << '\n'; }
    68   } tree;
    69   do_nothing_map dist;   //node->int (W)
    70   do_nothing_map priority; //node->int (W)
    71 };
    72 
    73 
    74 int main()
    75 {
    76   IGraph IG;
    77   IMaps_t IMaps;
    78 
    79   IGraph::NodeIterator in;
    80   IG.GetFirst(in);
    81   ++in;
    82   bfs(IG,in,IMaps);  
    83 }