COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/work/marci/bipartite_matching_try_2.cc @ 499:767f3da8ce0e

Last change on this file since 499:767f3da8ce0e was 499:767f3da8ce0e, checked in by marci, 20 years ago

A bipartite graph template can be used as BipartiteGraph?<ListGraph?>.

File size: 2.9 KB
Line 
1// -*- c++ -*-
2#include <iostream>
3#include <fstream>
4#include <vector>
5#include <cstdlib>
6
7#include <list_graph.h>
8//#include <smart_graph.h>
9//#include <dimacs.h>
10#include <time_measure.h>
11#include <for_each_macros.h>
12#include <bfs_iterator.h>
13#include <bipartite_graph_wrapper.h>
14#include <maps.h>
15#include <max_flow.h>
16
17/**
18 * Inicializalja a veletlenszamgeneratort.
19 * Figyelem, ez nem jo igazi random szamokhoz,
20 * erre ne bizzad a titkaidat!
21 */
22void 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 */
34int random(int m)
35{
36  return int( double(m) * rand() / (RAND_MAX + 1.0) );
37}
38
39using namespace hugo;
40
41int main() {
42  //typedef UndirListGraph Graph;
43  typedef BipartiteGraph<ListGraph> Graph;
44 
45  typedef Graph::Node Node;
46  typedef Graph::NodeIt NodeIt;
47  typedef Graph::Edge Edge;
48  typedef Graph::EdgeIt EdgeIt;
49  typedef Graph::OutEdgeIt OutEdgeIt;
50
51  Graph g;
52
53  std::vector<Graph::Node> s_nodes;
54  std::vector<Graph::Node> t_nodes;
55
56  int a;
57  std::cout << "number of nodes in the first color class=";
58  std::cin >> a;
59  int b;
60  std::cout << "number of nodes in the second color class=";
61  std::cin >> b;
62  int m;
63  std::cout << "number of edges=";
64  std::cin >> m;
65 
66
67  for (int i=0; i<a; ++i) s_nodes.push_back(g.addNode(false));
68  for (int i=0; i<b; ++i) t_nodes.push_back(g.addNode(true));
69
70  random_init();
71  for(int i=0; i<m; ++i) {
72    g.addEdge(s_nodes[random(a)], t_nodes[random(b)]);
73  }
74
75  std::cout << "Edges of the bipartite graph:" << std::endl;
76  FOR_EACH_LOC(EdgeIt, e, g) std::cout << e << " ";
77  std::cout << std::endl;
78
79  typedef stGraphWrapper<Graph> stGW;
80  stGW stgw(g);
81  ConstMap<stGW::Edge, int> const1map(1);
82
83
84
85
86  Timer ts;
87  ts.reset();
88  stGW::EdgeMap<int> flow(stgw);
89  MaxFlow<stGW, int, ConstMap<stGW::Edge, int>, stGW::EdgeMap<int> >
90    max_flow_test(stgw, stgw.S_NODE, stgw.T_NODE, const1map, flow);
91//  while (max_flow_test.augmentOnShortestPath()) { }
92  typedef ListGraph MutableGraph;
93//  while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) {
94  while (max_flow_test.augmentOnBlockingFlow2()) {
95   std::cout << max_flow_test.flowValue() << std::endl;
96  }
97  std::cout << "max flow value: " << max_flow_test.flowValue() << std::endl;
98  std::cout << "elapsed time: " << ts << std::endl;
99  FOR_EACH_LOC(stGW::EdgeIt, e, stgw) {
100    if (flow[e]) std::cout << e << std::endl;
101  }
102  std::cout << std::endl;
103
104  ts.reset();
105  stGW::EdgeMap<int> pre_flow(stgw);
106  MaxFlow<stGW, int, ConstMap<stGW::Edge, int>, stGW::EdgeMap<int> >
107    pre_flow_test(stgw, stgw.S_NODE, stgw.T_NODE, const1map, pre_flow/*, true*/);
108  pre_flow_test.run();
109  std::cout << "pre flow value: " << max_flow_test.flowValue() << std::endl;
110  std::cout << "elapsed time: " << ts << std::endl;
111//   FOR_EACH_LOC(stGW::EdgeIt, e, stgw) {
112//     std::cout << e << ": " << pre_flow[e] << "\n";
113//   }
114//   std::cout << "\n";
115
116  return 0;
117}
Note: See TracBrowser for help on using the repository browser.