COIN-OR::LEMON - Graph Library

Ignore:
Timestamp:
03/17/04 18:04:41 (20 years ago)
Author:
marci
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@274
Message:

.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/work/marci/max_bipartite_matching_demo.cc

    r196 r197  
    55#include <cstdlib>
    66
    7 //#include <LEDA/graph.h>
    8 //#include <leda_graph_wrapper.h>
     7#include <LEDA/graph.h>
     8#include <LEDA/mcb_matching.h>
     9#include <LEDA/list.h>
     10
     11#include <leda_graph_wrapper.h>
    912#include <list_graph.h>
    1013#include <dimacs.h>
     
    3740
    3841using std::cout;
     42using std::cin;
    3943using std::endl;
    4044
    4145int main() {
    42 //   leda::graph g;
    43 //   typedef LedaGraphWrapper<leda::graph> Graph;
    44 //   Graph G(g);
    45   typedef ListGraph Graph;
    46   Graph G;
     46   leda::graph g;
     47   typedef LedaGraphWrapper<leda::graph> Graph;
     48   Graph G(g);
     49//  typedef ListGraph Graph;
     50//  Graph G;
    4751
    4852  typedef Graph::Node Node;
     
    5963  std::vector<Node> t_nodes;
    6064
    61   for(int i=0; i<4; ++i) {
     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
     76  for(int i=0; i<a; ++i) {
    6277    s_nodes.push_back(G.addNode());
    6378  }
    64   for(int i=0; i<4; ++i) {
     79  for(int i=0; i<a; ++i) {
    6580    t_nodes.push_back(G.addNode());
    6681  }
    6782  random_init();
    68   for(int i=0; i<6; ++i) {
    69     G.addEdge(s_nodes[random(4)], t_nodes[random(4)]);
    70   }
    71  
     83  for(int i=0; i<m; ++i) {
     84    G.addEdge(s_nodes[random(a)], t_nodes[random(b)]);
     85  }
     86 
     87//   G.addEdge(s_nodes[1], t_nodes[5-4]);
     88//   G.addEdge(s_nodes[1], t_nodes[5-4]);
     89//   G.addEdge(s_nodes[1], t_nodes[4-4]);
     90//   G.addEdge(s_nodes[1], t_nodes[4-4]);
    7291//   G.addEdge(s_nodes[2], t_nodes[4-4]);
    73 //   G.addEdge(s_nodes[2], t_nodes[7-4]);
    74 //   G.addEdge(s_nodes[2], t_nodes[4-4]);
    75 //   G.addEdge(s_nodes[3], t_nodes[6-4]);
    76 //   G.addEdge(s_nodes[3], t_nodes[5-4]);
    77 //   G.addEdge(s_nodes[3], t_nodes[5-4]);
     92//   G.addEdge(s_nodes[3], t_nodes[4-4]);
    7893
    7994
     
    8196  Graph::NodeMap<bool> t_map(G); //false
    8297 
    83   for(int i=0; i<4; ++i) {
    84     s_map.set(s_nodes[i], true);
    85     t_map.set(t_nodes[i], true);
    86   }
    87 
    88   cout << "bfs and dfs iterator demo on the directed graph" << endl;
    89   for(NodeIt n=G.first<NodeIt>(); G.valid(n); G.next(n)) {
    90     cout << G.id(n) << ": ";
    91     cout << "out edges: ";
    92     for(OutEdgeIt e=G.first<OutEdgeIt>(n); G.valid(e); G.next(e))
    93       cout << G.id(G.tail(e)) << "->" << G.id(G.head(e)) << " ";
    94     cout << "in edges: ";
    95     for(InEdgeIt e=G.first<InEdgeIt>(n); G.valid(e); G.next(e))
    96       cout << G.id(G.tail(e)) << "->" << G.id(G.head(e)) << " ";
    97     cout << endl;
    98   }
     98  for(int i=0; i<a; ++i) s_map.set(s_nodes[i], true);
     99  for(int i=0; i<b; ++i) t_map.set(t_nodes[i], true);
     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//   }
    99112
    100113
     
    108121
    109122    MaxMatching<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > max_flow_test(G, s_map, t_map, flow, cap);
    110     //max_flow_test.augmentWithBlockingFlow<Graph>();
    111123    int i=0;
    112124    while (max_flow_test.augmentOnShortestPath()) {
    113 //     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) {
    114 //       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
    115 //     }
    116 //     std::cout<<std::endl;
     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;
    117128      ++i;
    118129    }
    119130
    120     std::cout << "maximum matching: "<< std::endl;
    121     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e)) 
    122       if (flow.get(e))
    123         std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
    124     std::cout<<std::endl;
    125     std::cout << "edges which are not in this maximum matching: "<< std::endl;
    126     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e)) 
    127       if (!flow.get(e))
    128         std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
    129     std::cout<<std::endl;
     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;
    130141   
    131142    std::cout << "elapsed time: " << ts << std::endl;
     
    133144    std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
    134145  }
     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    Timer ts;
     186    ts.reset();
     187
     188    //MaxMatching<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > max_flow_test(G, s_map, t_map, flow, cap);
     189    //int i=0;
     190    //while (max_flow_test.augmentOnShortestPath()) { ++i; }
     191
     192    leda_list<leda_edge> l=MAX_CARD_BIPARTITE_MATCHING(g);   
     193   
     194
     195//     std::cout << "maximum matching: "<< std::endl;
     196//     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e)) 
     197//       if (flow.get(e))
     198//      std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
     199//     std::cout<<std::endl;
     200//     std::cout << "edges which are not in this maximum matching: "<< std::endl;
     201//     for(EdgeIt e=G.first<EdgeIt>(); G.valid(e); G.next(e)) 
     202//       if (!flow.get(e))
     203//      std::cout << G.id(G.tail(e)) << "-" << flow.get(e) << "->" << G.id(G.head(e)) << " ";
     204//     std::cout<<std::endl;
     205   
     206   
     207    std::cout << "elapsed time: " << ts << std::endl;
     208    //std::cout << "number of augmentation phases: " << i << std::endl;
     209    std::cout << "flow value: "<< l.size() << std::endl;
     210  }
     211 
    135212 
    136213
Note: See TracChangeset for help on using the changeset viewer.