#include <iostream>
#include <graph.h>
#include <bfs.h>

using namespace NEGRO;
using namespace std;

class NodeData;
class EdgeData;

typedef Graph<NodeData,EdgeData> TestGraph;

class NodeData
{
public:
  int id;
  bool isVis;
  bfs_node_data<TestGraph> bfs;
};

class EdgeData
{
public:
  int id;
};

typedef Graph<NodeData,EdgeData> TestGraph;

int main()
{
  TestGraph G;
  TestGraph::NodeIterator n,m;
  TestGraph::OutEdgeIterator e;
  int i;

  
  //for(i=1;i<=10;i++) G.AddNode().n=i; //Ez nagyon rossz!!!!!!!!
  for(i=1;i<=10;i++) G.AddNode()->id=i; //Ez a jo!!!!!!!!

  //n=G.AddNode();
  
   //for(i=1;i<=10;i++) cout << (G.AddNode()->n=i) << ' ';
   //cout << '\n';
 
  i=0;
  for(G.GetFirst(n);n.Valid();n++)
    for(G.GetFirst(m);m.Valid();++m)
      if(n!=m) G.AddEdge(n,m)->id=++i;
   
  cout << "Number of edges: " << i << "\n\n";

  TestGraph::AllEdgeIterator a;
  for(G.GetFirst(a);a.Valid();++a)
    cout << a->id << ":" << a.From()->id << "->" << a.To()->id << "   ";

  cout << "\n\n\n";
  
  for(G.GetFirst(n);n.Valid();++n)
    {
      cout << n->id << "->";
      for(G.GetFirst(e,n);e.Valid();++e)
	cout << e->id << ":" << e.To()->id << ' ';
      cout << '\n';
    }
  
  cout << "\n\n\n\nB-verzio:\n\n\n";
  
  G.Clean();

  for(i=1;i<=10;i++) G.AddNode()->id=i;
  
  i=0;
  for(n=G.First();n.Valid();n++)
    for(m=G.First();m.Valid();++m)
      if(n!=m) G.AddEdge(n,m)->id=++i;
   
  ;
  for(n=G.First();n.Valid();++n) //Demo
    {
      e=G.First(n);
      while(e.Valid())
	if((e->id)%2) G.Delete(e++);  //it may be nice to have a postfix ++
	else ++e;
    }
  
  // cout << "Number of edges: " << i << "\n\n";

  for(a=G.First();a.Valid();++a)
    cout << a->id << ": " << a.From()->id << "->" << a.To()->id << "   ";
  
  cout << "\n\n\n";
  
  for(n=G.First();n.Valid();++n)
    {
      cout << n->id << "->";
      for(e=G.First(n);e.Valid();++e)
	cout << e->id << ":" << e.To()->id << ' ';
      cout << '\n';
    }
  
  // For Marci's sake
  
  {
    G.Clean();
    
    for(int i=1;i<=10;i++) G.AddNode()->id=i;
    
    
    {  //I would'n say I'm really happy with this.
      int i=0;
      for(TestGraph::NodeIterator n(G);n.Valid();n++)
	for(TestGraph::NodeIterator m(G);m.Valid();++m)
	  if(n!=m) G.AddEdge(n,m)->id=++i;
    }
    
    for(TestGraph::NodeIterator n(G);n.Valid();++n) //Demo
      {
	TestGraph::OutEdgeIterator e(G,n);
	while(e.Valid())
	  if((e->id)%2) G.Delete(e++);  //it may be nice to have a postfix ++
	  else ++e;
      }
    
    for(TestGraph::AllEdgeIterator a(G);a.Valid();++a)
      cout << a->id << ": " << a.From()->id << "->" << a.To()->id << "   ";
    
    cout << "\n\n\n";
    
    for(TestGraph::NodeIterator n(G);n.Valid();++n)
      {
	cout << n->id << "->";
	for(TestGraph::OutEdgeIterator e(G,n);e.Valid();++e)
	  cout << e->id << ":" << e.To()->id << ' ';
	cout << '\n';
      }
  }
}
