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 }  |