src/work/jacint/ledacomp.cc
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
child 921 818510fa3d99
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
jacint@581
     1
// -*- c++ -*-
jacint@581
     2
#include <iostream>
jacint@581
     3
#include <fstream>
jacint@581
     4
#include <vector>
jacint@581
     5
#include <cstdlib>
jacint@581
     6
jacint@581
     7
#include <LEDA/graph.h>
jacint@581
     8
#include <LEDA/mc_matching.h>
jacint@581
     9
#include <LEDA/list.h>
jacint@581
    10
#include <LEDA/graph_gen.h>
jacint@581
    11
jacint@581
    12
#include <leda_graph_wrapper.h>
jacint@581
    13
#include <list_graph.h>
jacint@581
    14
#include <dimacs.h>
jacint@581
    15
#include <time_measure.h>
jacint@581
    16
#include <for_each_macros.h>
jacint@581
    17
#include <graph_wrapper.h>
jacint@581
    18
#include <bipartite_graph_wrapper.h>
jacint@581
    19
#include <maps.h>
jacint@581
    20
#include <max_matching.h>
jacint@581
    21
jacint@581
    22
// /**
jacint@581
    23
//  * Inicializalja a veletlenszamgeneratort.
jacint@581
    24
//  * Figyelem, ez nem jo igazi random szamokhoz,
jacint@581
    25
//  * erre ne bizzad a titkaidat!
jacint@581
    26
//  */
jacint@581
    27
// void random_init()
jacint@581
    28
// {
jacint@581
    29
// 	unsigned int seed = getpid();
jacint@581
    30
// 	seed |= seed << 15;
jacint@581
    31
// 	seed ^= time(0);
jacint@581
    32
jacint@581
    33
// 	srand(seed);
jacint@581
    34
// }
jacint@581
    35
jacint@581
    36
// /**
jacint@581
    37
//  * Egy veletlen int-et ad vissza 0 es m-1 kozott.
jacint@581
    38
//  */
jacint@581
    39
// int random(int m)
jacint@581
    40
// {
jacint@581
    41
//   return int( double(m) * rand() / (RAND_MAX + 1.0) );
jacint@581
    42
// }
jacint@581
    43
jacint@581
    44
using namespace hugo;
jacint@581
    45
jacint@581
    46
int main() {
jacint@581
    47
jacint@581
    48
  //for leda graph
jacint@581
    49
  leda::graph lg;
jacint@581
    50
  //lg.make_undirected();
jacint@581
    51
  typedef LedaGraphWrapper<leda::graph> Graph;
jacint@581
    52
  Graph g(lg);
jacint@581
    53
jacint@581
    54
  //for UndirListGraph
jacint@581
    55
  //typedef UndirListGraph Graph; 
jacint@581
    56
  //Graph g;
jacint@581
    57
jacint@581
    58
  typedef Graph::Node Node;
jacint@581
    59
  typedef Graph::NodeIt NodeIt;
jacint@581
    60
  typedef Graph::Edge Edge;
jacint@581
    61
  typedef Graph::EdgeIt EdgeIt;
jacint@581
    62
  typedef Graph::OutEdgeIt OutEdgeIt;
jacint@581
    63
jacint@581
    64
  std::vector<Graph::Node> s_nodes;
jacint@581
    65
  std::vector<Graph::Node> t_nodes;
jacint@581
    66
jacint@581
    67
  int n;
jacint@581
    68
  std::cout << "Number of nodes=";
jacint@581
    69
  std::cin >> n; 
jacint@581
    70
  int m;
jacint@581
    71
  std::cout << "number of edges=";
jacint@581
    72
  std::cin >> m; 
jacint@581
    73
  std::cout << std::endl;
jacint@581
    74
  
jacint@581
    75
  random_graph(lg, n, m);
jacint@581
    76
jacint@581
    77
  Timer ts;
jacint@581
    78
jacint@581
    79
  //  writeDimacs(std::cout, g); //for check
jacint@581
    80
jacint@581
    81
  MaxMatching<Graph> max_matching(g);
jacint@581
    82
  std::cout << 
jacint@581
    83
    "Running the edmonds algorithm run()... " 
jacint@581
    84
	    <<std::endl;
jacint@581
    85
  ts.reset();  
jacint@581
    86
  max_matching.run();
jacint@581
    87
  std::cout<<"Elapsed time: "<<ts<<std::endl;
jacint@581
    88
  int s=0;
jacint@581
    89
  Graph::NodeMap<Node> mate(g,INVALID);
jacint@581
    90
  max_matching.writeNMapNode(mate);
jacint@581
    91
  NodeIt v;
jacint@581
    92
  for(g.first(v); g.valid(v); g.next(v) ) {
jacint@581
    93
    if ( g.valid(mate[v]) ) {
jacint@581
    94
      ++s;
jacint@581
    95
    }
jacint@581
    96
  }
jacint@581
    97
  int size=(int)s/2;  //size will be used as the size of a maxmatching
jacint@581
    98
  std::cout << size << " is the size of the matching found by run(),"<<std::endl;
jacint@581
    99
  if ( size == max_matching.size() ) {
jacint@581
   100
    std::cout<< "which equals to the size of the actual matching reported by size().\n"<< std::endl;
jacint@581
   101
  } else {  
jacint@581
   102
    std::cout<< "which does not equal to the size of the actual matching reported by size()!\n"<< std::endl;
jacint@581
   103
  }
jacint@581
   104
jacint@581
   105
jacint@581
   106
jacint@581
   107
jacint@581
   108
  ts.reset();  
jacint@581
   109
  leda_list<leda_edge> ml=MAX_CARD_MATCHING(lg);
jacint@581
   110
  std::cout << "LEDA max matching algorithm." << std::endl 
jacint@581
   111
	    << "Size of matching: " 
jacint@581
   112
	    << ml.size() << std::endl;
jacint@581
   113
  std::cout << "elapsed time: " << ts << std::endl;
jacint@581
   114
  std::cout << "\n";
jacint@581
   115
jacint@581
   116
  return 0;
jacint@581
   117
}