COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/work/marci/bipartite_matching_try_2.cc @ 602:580b329c2a0c

Last change on this file since 602:580b329c2a0c was 602:580b329c2a0c, checked in by marci, 20 years ago

bfs_iterator -> bfs_dfs.h, some docs

File size: 3.6 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 <hugo/time_measure.h>
11#include <for_each_macros.h>
12#include <bfs_dfs.h>
13#include <bipartite_graph_wrapper.h>
14#include <hugo/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  std::cout << "Generatig a random bipartite graph..." << std::endl;
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//   std::cout << "Nodes:" << std::endl;
80//   FOR_EACH_LOC(Graph::NodeIt, v, g) std::cout << v << " ";
81//   std::cout << std::endl;
82//   std::cout << "Nodes in T:" << std::endl;
83//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::T_CLASS) std::cout << v << " ";
84//   std::cout << std::endl;
85//   std::cout << "Nodes in S:" << std::endl;
86//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::S_CLASS) std::cout << v << " ";
87//   std::cout << std::endl;
88
89//   std::cout << "Erasing the first node..." << std::endl;
90//   NodeIt n;
91//   g.first(n);
92//   g.erase(n);
93//   std::cout << "Nodes of the bipartite graph:" << std::endl;
94//   FOR_EACH_GLOB(n, g) std::cout << n << " ";
95//   std::cout << std::endl;
96
97//   std::cout << "Nodes in T:" << std::endl;
98//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::T_CLASS) std::cout << v << " ";
99//   std::cout << std::endl;
100//   std::cout << "Nodes in S:" << std::endl;
101//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::S_CLASS) std::cout << v << " ";
102//   std::cout << std::endl;
103
104  typedef stGraphWrapper<Graph> stGW;
105  stGW stgw(g);
106  ConstMap<stGW::Edge, int> const1map(1);
107
108  Timer ts;
109  ts.reset();
110  stGW::EdgeMap<int> flow(stgw);
111  MaxFlow<stGW, int, ConstMap<stGW::Edge, int>, stGW::EdgeMap<int> >
112    max_flow_test(stgw, stgw.S_NODE, stgw.T_NODE, const1map, flow);
113  max_flow_test.run();
114//  while (max_flow_test.augmentOnShortestPath()) { }
115//  typedef ListGraph MutableGraph;
116//  while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) {
117//  while (max_flow_test.augmentOnBlockingFlow2()) {
118//   std::cout << max_flow_test.flowValue() << std::endl;
119//  }
120  std::cout << "max flow value: " << max_flow_test.flowValue() << std::endl;
121  std::cout << "elapsed time: " << ts << std::endl;
122//   FOR_EACH_LOC(stGW::EdgeIt, e, stgw) {
123//     if (flow[e]) std::cout << e << std::endl;
124//   }
125//   std::cout << std::endl;
126
127  return 0;
128}
Note: See TracBrowser for help on using the repository browser.