src/work/graphdemo.cc
changeset 3 272a5677bd6d
parent 2 37117ebbabe2
child 35 65dca0f43fba
equal deleted inserted replaced
1:609ad50d4314 2:0c2a4df420bb
    24   int id;
    24   int id;
    25 };
    25 };
    26 
    26 
    27 typedef Graph<NodeData,EdgeData> TestGraph;
    27 typedef Graph<NodeData,EdgeData> TestGraph;
    28 
    28 
    29 /*
    29 int main()
    30 struct isVis_map {};
       
    31 bool Get(isVis_map p,TestGraph::NodeIterator i) { return i->isVis;}
       
    32 void Set(isVis_map p,TestGraph::NodeIterator i,bool b) {  i->isVis=b;}
       
    33 */
       
    34 
       
    35 class my_bfs_maps
       
    36 {
       
    37 public:
       
    38   //isVis_map visited;  //node->bool (RW)
       
    39   class_element_map<TestGraph::NodeIterator,
       
    40 		    TestGraph::NodeType,
       
    41 		    bool,
       
    42 		    &NodeData::isVis> visited;
       
    43   struct _tree_map_t {
       
    44     typedef TestGraph::EdgeIterator value_type;
       
    45     void Set(const TestGraph::NodeIterator &n,const value_type &t)
       
    46     {
       
    47       cout << t.From()->id << "->" << t.To()->id << '\n';
       
    48     }
       
    49   } tree;
       
    50   do_nothing_map dist;   //node->int (W)
       
    51   do_nothing_map priority; //node->int (W)
       
    52   //priority_map priority; //node->int (W)
       
    53 };
       
    54 
       
    55 
       
    56 
       
    57 
       
    58 class IGraph 
       
    59 {
       
    60 public:
       
    61 
       
    62   //  struct NodeType {bfs_node_data<TestGraph> bfs;};
       
    63   struct NodeType {bool isVis;};
       
    64 
       
    65   vector<NodeType> nodes;
       
    66   
       
    67   class NodeIterator 
       
    68   {
       
    69   public:
       
    70     IGraph *G;
       
    71     int n;
       
    72     NodeIterator &operator ++() { n++; return *this;}
       
    73     NodeType &operator *() const { return G->nodes[n];}
       
    74     NodeType *operator ->() const { return &(G->nodes[n]);}
       
    75     bool isValid() const {return n<=5000;}
       
    76     int Index() {return n;} //csak a kiirashoz kell
       
    77   };
       
    78 
       
    79   void GetFirst(NodeIterator &i) {i.G=this;i.n=1;}
       
    80 
       
    81   class OutEdgeIterator 
       
    82   {    
       
    83   public:
       
    84     IGraph *G;
       
    85     int f,t;
       
    86     int gcd() { int a=f;int b=t;int c;while(c=a%b) {a=b;b=c;} ; return b;}
       
    87     OutEdgeIterator &operator ++() {while(++t<=5000&&gcd()==1);return *this;}
       
    88     bool isValid() const {return t<=5000;}
       
    89     NodeIterator From() const {NodeIterator i; i.G=G;i.n=f;return i;}
       
    90     NodeIterator To() const {NodeIterator i; i.G=G;i.n=t;return i;}
       
    91     NodeIterator Anode() const {return From();}
       
    92     NodeIterator Bnode() const {return To();}
       
    93   };
       
    94 
       
    95   typedef OutEdgeIterator EdgeIterator;
       
    96   void GetFirst(OutEdgeIterator &i,const NodeIterator &n)
       
    97   {i.G=this;i.f=n.n;i.t=0;++i;}
       
    98 
       
    99   IGraph() : nodes(5000) {}
       
   100 };
       
   101 
       
   102 class IMaps_t
       
   103 {
       
   104 public:
       
   105 //     class_element_map<IGraph::NodeIterator,
       
   106 //   		    IGraph::NodeType,
       
   107 //   		    bool,
       
   108 //   		    &IGraph::NodeType::isVis> visited;
       
   109   struct _visited_map_t {
       
   110     typedef bool value_type;
       
   111     void Set(const IGraph::NodeIterator &n,const value_type &t) { n->isVis=t; }
       
   112     value_type Get(const IGraph::NodeIterator &n) const { return n->isVis; }
       
   113   } visited;
       
   114   struct _tree_map_t {
       
   115     typedef IGraph::EdgeIterator value_type;
       
   116     void Set(const IGraph::NodeIterator &n,const value_type &t)
       
   117     { cout << t.From().Index() << "->" << t.To().Index() << '\n'; }
       
   118   } tree;
       
   119   do_nothing_map dist;   //node->int (W)
       
   120   do_nothing_map priority; //node->int (W)
       
   121 };
       
   122 
       
   123 void main()
       
   124 {
    30 {
   125   TestGraph G;
    31   TestGraph G;
   126   TestGraph::NodeIterator n,m,o,p,q;
    32   TestGraph::NodeIterator n,m;
   127   TestGraph::OutEdgeIterator e,f,g,h;
    33   TestGraph::OutEdgeIterator e;
   128   int i,j,k;
    34   int i;
   129 
    35 
   130   
    36   
   131   //for(i=1;i<=10;i++) G.AddNode().n=i; //Ez nagyon rossz!!!!!!!!
    37   //for(i=1;i<=10;i++) G.AddNode().n=i; //Ez nagyon rossz!!!!!!!!
   132   for(i=1;i<=10;i++) G.AddNode()->id=i; //Ez a jo!!!!!!!!
    38   for(i=1;i<=10;i++) G.AddNode()->id=i; //Ez a jo!!!!!!!!
   133 
    39 
   167   for(n=G.First();n.isValid();n++)
    73   for(n=G.First();n.isValid();n++)
   168     for(m=G.First();m.isValid();++m)
    74     for(m=G.First();m.isValid();++m)
   169       if(n!=m) G.AddEdge(n,m)->id=++i;
    75       if(n!=m) G.AddEdge(n,m)->id=++i;
   170    
    76    
   171   ;
    77   ;
   172   for(n=G.First();n.isValid();++n)
    78   for(n=G.First();n.isValid();++n) //Demo
   173     {
    79     {
   174       e=G.First(n);
    80       e=G.First(n);
   175       while(e.isValid())
    81       while(e.isValid())
   176 	if((e->id)%2) G.Delete(e++);
    82 	if((e->id)%2) G.Delete(e++);  //it may be nice to have a postfix ++
   177 	else ++e;
    83 	else ++e;
   178     }
    84     }
   179   
    85   
   180   // cout << "Number of edges: " << i << "\n\n";
    86   // cout << "Number of edges: " << i << "\n\n";
   181 
    87 
   190       for(e=G.First(n);e.isValid();++e)
    96       for(e=G.First(n);e.isValid();++e)
   191 	cout << e->id << ":" << e.To()->id << ' ';
    97 	cout << e->id << ":" << e.To()->id << ' ';
   192       cout << '\n';
    98       cout << '\n';
   193     }
    99     }
   194   
   100   
   195   n=G.First();
   101   // For Marci's sake
   196 
       
   197 
       
   198   //G.Clean();
       
   199 
       
   200   cout << "\n\n\n BFS \n\n\n";
       
   201   //my_bfs_maps Maps;
       
   202   //  bfs_static_maps<TestGraph> Maps(&NodeData::bfs);
       
   203   
   102   
   204   /// bfs(G,n,Maps);
   103   {
   205 
   104     G.Clean();
   206   cout << '\n';
   105     
   207 
   106     for(int i=1;i<=10;i++) G.AddNode()->id=i;
   208   IGraph IG;
   107     
   209   IMaps_t IMaps;
   108     
   210 
   109     {  //I would'n say I'm really happy with this.
   211   IGraph::NodeIterator in;
   110       int i;
   212   IG.GetFirst(in);
   111       for(TestGraph::NodeIterator n(G);n.isValid();n++)
   213   ++in;
   112 	for(TestGraph::NodeIterator m(G);m.isValid();++m)
   214   bfs(IG,in,IMaps);
   113 	  if(n!=m) G.AddEdge(n,m)->id=++i;
   215   
   114     }
   216   
   115     
       
   116     for(TestGraph::NodeIterator n(G);n.isValid();++n) //Demo
       
   117       {
       
   118 	TestGraph::OutEdgeIterator e(G,n);
       
   119 	while(e.isValid())
       
   120 	  if((e->id)%2) G.Delete(e++);  //it may be nice to have a postfix ++
       
   121 	  else ++e;
       
   122       }
       
   123     
       
   124     for(TestGraph::AllEdgeIterator a(G);a.isValid();++a)
       
   125       cout << a->id << ": " << a.From()->id << "->" << a.To()->id << "   ";
       
   126     
       
   127     cout << "\n\n\n";
       
   128     
       
   129     for(TestGraph::NodeIterator n(G);n.isValid();++n)
       
   130       {
       
   131 	cout << n->id << "->";
       
   132 	for(TestGraph::OutEdgeIterator e(G,n);e.isValid();++e)
       
   133 	  cout << e->id << ":" << e.To()->id << ' ';
       
   134 	cout << '\n';
       
   135       }
       
   136   }
   217 }
   137 }