Changeset 197:fff43d9c7110 in lemon-0.x for src/work/marci
- Timestamp:
- 03/17/04 18:04:41 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@274
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/work/marci/max_bipartite_matching_demo.cc
r196 r197 5 5 #include <cstdlib> 6 6 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> 9 12 #include <list_graph.h> 10 13 #include <dimacs.h> … … 37 40 38 41 using std::cout; 42 using std::cin; 39 43 using std::endl; 40 44 41 45 int 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; 47 51 48 52 typedef Graph::Node Node; … … 59 63 std::vector<Node> t_nodes; 60 64 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) { 62 77 s_nodes.push_back(G.addNode()); 63 78 } 64 for(int i=0; i< 4; ++i) {79 for(int i=0; i<a; ++i) { 65 80 t_nodes.push_back(G.addNode()); 66 81 } 67 82 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]); 72 91 // 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]); 78 93 79 94 … … 81 96 Graph::NodeMap<bool> t_map(G); //false 82 97 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 // } 99 112 100 113 … … 108 121 109 122 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>();111 123 int i=0; 112 124 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; 117 128 ++i; 118 129 } 119 130 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; 130 141 131 142 std::cout << "elapsed time: " << ts << std::endl; … … 133 144 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; 134 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 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 135 212 136 213
Note: See TracChangeset
for help on using the changeset viewer.