src/work/marci/leda/max_bipartite_matching_demo.cc
author klao
Wed, 29 Sep 2004 16:31:24 +0000
changeset 922 e816fac59f6d
parent 771 ad7dff9ee2fd
child 986 e997802b855c
permissions -rw-r--r--
hugo -> lemon renaming leftovers
     1 // -*- c++ -*-
     2 #include <iostream>
     3 #include <fstream>
     4 #include <vector>
     5 #include <cstdlib>
     6 
     7 #include <LEDA/graph.h>
     8 #include <LEDA/mcb_matching.h>
     9 #include <LEDA/list.h>
    10 
    11 #include <leda_graph_wrapper.h>
    12 #include <sage_graph.h>
    13 #include <dimacs.h>
    14 #include <time_measure.h>
    15 #include <edmonds_karp.h>
    16 
    17 /**
    18  * Inicializalja a veletlenszamgeneratort.
    19  * Figyelem, ez nem jo igazi random szamokhoz,
    20  * erre ne bizzad a titkaidat!
    21  */
    22 void random_init()
    23 {
    24 	unsigned int seed = getpid();
    25 	seed |= seed << 15;
    26 	seed ^= time(0);
    27 
    28 	srand(seed);
    29 }
    30 
    31 /**
    32  * Egy veletlen int-et ad vissza 0 es m-1 kozott.
    33  */
    34 int random(int m)
    35 {
    36 	return int( double(m) * rand() / (RAND_MAX + 1.0) );
    37 }
    38 
    39 using namespace lemon;
    40 
    41 using std::cout; 
    42 using std::cin; 
    43 using std::endl;
    44 
    45 int main() {
    46    leda::graph g;
    47    typedef LedaGraphWrapper<leda::graph> Graph;
    48    Graph G(g);
    49 //  typedef ListGraph Graph;
    50 //  Graph G;
    51 
    52   typedef Graph::Node Node;
    53   typedef Graph::NodeIt NodeIt;  
    54   typedef Graph::Edge Edge;
    55   typedef Graph::EdgeIt EdgeIt;
    56   typedef Graph::OutEdgeIt OutEdgeIt;
    57   typedef Graph::InEdgeIt InEdgeIt;
    58 
    59   //Node s, t;
    60   //Graph::EdgeMap<int> cap(G);
    61   //readDimacsMaxFlow(std::cin, G, s, t, cap);
    62   std::vector<Node> s_nodes;
    63   std::vector<Node> t_nodes;
    64 
    65   int a;
    66   cout << "number of nodes in the first color class=";
    67   cin >> a; 
    68   int b;
    69   cout << "number of nodes in the second color class=";
    70   cin >> b; 
    71   int m;
    72   cout << "number of edges=";
    73   cin >> m;   
    74 
    75   for(int i=0; i<a; ++i) {
    76     s_nodes.push_back(G.addNode());
    77   }
    78   for(int i=0; i<a; ++i) {
    79     t_nodes.push_back(G.addNode());
    80   }
    81   random_init();
    82   for(int i=0; i<m; ++i) {
    83     G.addEdge(s_nodes[random(a)], t_nodes[random(b)]);
    84   }
    85   
    86 //   G.addEdge(s_nodes[1], t_nodes[5-4]);
    87 //   G.addEdge(s_nodes[1], t_nodes[5-4]);
    88 //   G.addEdge(s_nodes[1], t_nodes[4-4]);
    89 //   G.addEdge(s_nodes[1], t_nodes[4-4]);
    90 //   G.addEdge(s_nodes[2], t_nodes[4-4]);
    91 //   G.addEdge(s_nodes[3], t_nodes[4-4]);
    92 
    93   leda_list<leda_node> A;
    94   leda_list<leda_node> B;
    95   Graph::NodeMap<bool> s_map(G); //false
    96   Graph::NodeMap<bool> t_map(G); //false
    97   
    98   for(int i=0; i<a; ++i) { s_map.set(s_nodes[i], true); A+=s_nodes[i]; }
    99   for(int i=0; i<b; ++i) { t_map.set(t_nodes[i], true); B+=t_nodes[i]; }
   100 
   101 //   cout << "bfs and dfs iterator demo on the directed graph" << endl;
   102 //   for(NodeIt n=G.first<NodeIt>(); G.valid(n); G.next(n)) { 
   103 //     cout << G.id(n) << ": ";
   104 //     cout << "out edges: ";
   105 //     for(OutEdgeIt e=G.first<OutEdgeIt>(n); G.valid(e); G.next(e)) 
   106 //       cout << G.id(G.tail(e)) << "->" << G.id(G.head(e)) << " ";
   107 //     cout << "in edges: ";
   108 //     for(InEdgeIt e=G.first<InEdgeIt>(n); G.valid(e); G.next(e)) 
   109 //       cout << G.id(G.tail(e)) << "->" << G.id(G.head(e)) << " ";
   110 //     cout << endl;
   111 //   }
   112 
   113 
   114   {
   115     std::cout << "on-the-fly max bipartite matching (Edmonds-Karp) demo on wrapped leda graph..." << std::endl;
   116     Graph::EdgeMap<int> flow(G); //0 flow
   117     Graph::EdgeMap<int> cap(G, 1);
   118 
   119     Timer ts;
   120     ts.reset();
   121 
   122     MaxMatching<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > max_flow_test(G, s_map, t_map, flow, cap);
   123     int i=0;
   124     while (max_flow_test.augmentOnShortestPath()) { 
   125 //       for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   126 // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   127 //       std::cout<<std::endl;
   128       ++i; 
   129     }
   130 
   131 //     std::cout << "maximum matching: "<< std::endl;
   132 //     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   133 //       if (flow.get(e))
   134 // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   135 //     std::cout<<std::endl;
   136 //     std::cout << "edges which are not in this maximum matching: "<< std::endl;
   137 //     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   138 //       if (!flow.get(e))
   139 // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   140 //     std::cout<<std::endl;
   141     
   142     std::cout << "elapsed time: " << ts << std::endl;
   143     std::cout << "number of augmentation phases: " << i << std::endl; 
   144     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
   145   }
   146 
   147 //   {
   148 //     std::cout << "on-the-fly max bipartite matching demo (Hopcroft-Karp) on wrapped leda graph..." << std::endl;
   149 //     Graph::EdgeMap<int> flow(G); //0 flow
   150 //     Graph::EdgeMap<int> cap(G, 1);
   151 
   152 //     Timer ts;
   153 //     ts.reset();
   154 
   155 //     MaxMatching<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > max_flow_test(G, s_map, t_map, flow, cap);
   156 //     int i=0;
   157 //     while (max_flow_test.augmentOnBlockingFlow2()) { 
   158 // //       for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   159 // // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   160 // //       std::cout<<std::endl;
   161 //       ++i; 
   162 //     }
   163 
   164 // //     std::cout << "maximum matching: "<< std::endl;
   165 // //     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   166 // //       if (flow.get(e))
   167 // // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   168 // //     std::cout<<std::endl;
   169 // //     std::cout << "edges which are not in this maximum matching: "<< std::endl;
   170 // //     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   171 // //       if (!flow.get(e))
   172 // // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   173 // //     std::cout<<std::endl;
   174     
   175 //     std::cout << "elapsed time: " << ts << std::endl;
   176 //     std::cout << "number of augmentation phases: " << i << std::endl; 
   177 //     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
   178 //   }
   179 
   180   {
   181     std::cout << "max bipartite matching (LEDA)..." << std::endl;
   182     //Graph::EdgeMap<int> flow(G); //0 flow
   183     //Graph::EdgeMap<int> cap(G, 1);
   184 
   185     leda_node_array<bool> NC(g);
   186 
   187     Timer ts;
   188     ts.reset();
   189 
   190     //MaxMatching<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > max_flow_test(G, s_map, t_map, flow, cap);
   191     //int i=0;
   192     //while (max_flow_test.augmentOnShortestPath()) { ++i; }
   193     
   194     //leda_list<leda_edge> l=MAX_CARD_BIPARTITE_MATCHING_HK(g, A, B, NC, false);
   195     leda_list<leda_edge> l=MAX_CARD_BIPARTITE_MATCHING(g);    
   196     
   197 
   198 //     std::cout << "maximum matching: "<< std::endl;
   199 //     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   200 //       if (flow.get(e))
   201 // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   202 //     std::cout<<std::endl;
   203 //     std::cout << "edges which are not in this maximum matching: "<< std::endl;
   204 //     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e))  
   205 //       if (!flow.get(e))
   206 // 	std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
   207 //     std::cout<<std::endl;
   208     
   209     
   210     std::cout << "elapsed time: " << ts << std::endl;
   211     //std::cout << "number of augmentation phases: " << i << std::endl; 
   212     std::cout << "flow value: "<< l.size() << std::endl;
   213   }
   214   
   215   
   216 
   217   return 0;
   218 }