# HG changeset patch # User marci # Date 1083345001 0 # Node ID 767f3da8ce0e572f2db07d76ba243ed2d5aec645 # Parent eb8bfa683d923c02b63a6bc750ae5706d1743c28 A bipartite graph template can be used as BipartiteGraph. diff -r eb8bfa683d92 -r 767f3da8ce0e src/work/marci/bipartite_graph_wrapper.h --- a/src/work/marci/bipartite_graph_wrapper.h Fri Apr 30 16:46:19 2004 +0000 +++ b/src/work/marci/bipartite_graph_wrapper.h Fri Apr 30 17:10:01 2004 +0000 @@ -31,9 +31,9 @@ SFalseTTrueMap; SFalseTTrueMap* s_false_t_true_map; - BipartiteGraphWrapper() : GraphWrapper(0) { } + BipartiteGraphWrapper() : GraphWrapper() { } void setSFalseTTrueMap(SFalseTTrueMap& _s_false_t_true_map) { - s_false_t_true_map=_s_false_t_true_map; + s_false_t_true_map=&_s_false_t_true_map; } public: @@ -196,11 +196,11 @@ public: typedef typename Parent::Node Node; typedef typename Parent::Edge Edge; - BipartiteGraph() : BipartiteGraphWrapper(0), + BipartiteGraph() : BipartiteGraphWrapper(), gr(), bipartite_map(gr), s_false_t_true_map(bipartite_map) { Parent::setGraph(gr); - Parent::setSFalseTTrueMap(bipartite_map); + Parent::setSFalseTTrueMap(s_false_t_true_map); } /// the \c bool parameter which can be \c S_Class or \c T_Class shows diff -r eb8bfa683d92 -r 767f3da8ce0e src/work/marci/bipartite_matching_try_2.cc --- a/src/work/marci/bipartite_matching_try_2.cc Fri Apr 30 16:46:19 2004 +0000 +++ b/src/work/marci/bipartite_matching_try_2.cc Fri Apr 30 17:10:01 2004 +0000 @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -40,7 +39,9 @@ using namespace hugo; int main() { - typedef UndirListGraph Graph; + //typedef UndirListGraph Graph; + typedef BipartiteGraph Graph; + typedef Graph::Node Node; typedef Graph::NodeIt NodeIt; typedef Graph::Edge Edge; @@ -63,108 +64,30 @@ std::cin >> m; - for (int i=0; i ref_map(g, -1); + std::cout << "Edges of the bipartite graph:" << std::endl; + FOR_EACH_LOC(EdgeIt, e, g) std::cout << e << " "; + std::cout << std::endl; - IterableBoolMap< Graph::NodeMap > bipartite_map(ref_map); - for (int i=0; i stGW; + stGW stgw(g); + ConstMap const1map(1); -// Graph::Node u; -// std::cout << "These nodes will be in S:\n"; -// //FIXME azert kellene ++, es invalid vizsgalat u-bol, hogy ezt le lehessen -// //irni 1etlen FOR_EACH-csel. -// for (bipartite_map.first(u, false); g.valid(u); bipartite_map.next(u)) -// std::cout << u << " "; -// std::cout << "\n"; -// std::cout << "These nodes will be in T:\n"; -// for (bipartite_map.first(u, true); g.valid(u); bipartite_map.next(u)) -// std::cout << u << " "; -// std::cout << "\n"; - typedef BipartiteGraphWrapper BGW; - BGW bgw(g, bipartite_map); - -// std::cout << "Nodes by NodeIt:\n"; -// FOR_EACH_LOC(BGW::NodeIt, n, bgw) { -// std::cout << n << " "; -// } -// std::cout << "\n"; -// std::cout << "Nodes in S by ClassNodeIt:\n"; -// FOR_EACH_INC_LOC(BGW::ClassNodeIt, n, bgw, bgw.S_CLASS) { -// std::cout << n << " "; -// } -// std::cout << "\n"; -// std::cout << "Nodes in T by ClassNodeIt:\n"; -// FOR_EACH_INC_LOC(BGW::ClassNodeIt, n, bgw, bgw.T_CLASS) { -// std::cout << n << " "; -// } -// std::cout << "\n"; -// std::cout << "Edges of the bipartite graph:\n"; -// FOR_EACH_LOC(BGW::EdgeIt, e, bgw) { -// std::cout << bgw.tail(e) << "->" << bgw.head(e) << std::endl; -// } - -// BGW::NodeMap dbyj(bgw); -// BGW::EdgeMap dbyxcj(bgw); - - typedef stGraphWrapper stGW; - stGW stgw(bgw); - ConstMap const1map(1); -// stGW::NodeMap ize(stgw); - -// BfsIterator< BGW, BGW::NodeMap > bfs(bgw); -// Graph::NodeIt si; -// Graph::Node s; -// s=g.first(si); -// bfs.pushAndSetReached(BGW::Node(s)); -// while (!bfs.finished()) { ++bfs; } - -// FOR_EACH_LOC(stGW::NodeIt, n, stgw) { -// std::cout << "out-edges of " << n << ":\n"; -// FOR_EACH_INC_LOC(stGW::OutEdgeIt, e, stgw, n) { -// std::cout << " " << e << "\n"; -// std::cout << " aNode: " << stgw.aNode(e) << "\n"; -// std::cout << " bNode: " << stgw.bNode(e) << "\n"; -// } -// std::cout << "in-edges of " << n << ":\n"; -// FOR_EACH_INC_LOC(stGW::InEdgeIt, e, stgw, n) { -// std::cout << " " << e << "\n"; -// std::cout << " aNode: " << stgw.aNode(e) << "\n"; -// std::cout << " bNode: " << stgw.bNode(e) << "\n"; -// } -// } -// std::cout << "Edges of the stGraphWrapper:\n"; -// FOR_EACH_LOC(stGW::EdgeIt, n, stgw) { -// std::cout << " " << n << "\n"; -// } - -// stGW::NodeMap b(stgw); -// FOR_EACH_LOC(stGW::NodeIt, n, stgw) { -// std::cout << n << ": " << b[n] <<"\n"; -// } - -// std::cout << "Bfs from s: \n"; -// BfsIterator< stGW, stGW::NodeMap > bfs_stgw(stgw); -// bfs_stgw.pushAndSetReached(stgw.S_NODE); -// while (!bfs_stgw.finished()) { -// std::cout << " " << stGW::OutEdgeIt(bfs_stgw) << "\n"; -// ++bfs_stgw; -// } Timer ts; ts.reset(); - stGW::EdgeMap max_flow(stgw); + stGW::EdgeMap flow(stgw); MaxFlow, stGW::EdgeMap > - max_flow_test(stgw, stgw.S_NODE, stgw.T_NODE, const1map, max_flow); + max_flow_test(stgw, stgw.S_NODE, stgw.T_NODE, const1map, flow); // while (max_flow_test.augmentOnShortestPath()) { } typedef ListGraph MutableGraph; // while (max_flow_test.augmentOnBlockingFlow1()) { @@ -173,10 +96,10 @@ } std::cout << "max flow value: " << max_flow_test.flowValue() << std::endl; std::cout << "elapsed time: " << ts << std::endl; -// FOR_EACH_LOC(stGW::EdgeIt, e, stgw) { -// std::cout << e << ": " << max_flow[e] << "\n"; -// } -// std::cout << "\n"; + FOR_EACH_LOC(stGW::EdgeIt, e, stgw) { + if (flow[e]) std::cout << e << std::endl; + } + std::cout << std::endl; ts.reset(); stGW::EdgeMap pre_flow(stgw); diff -r eb8bfa683d92 -r 767f3da8ce0e src/work/marci/graph_wrapper.h --- a/src/work/marci/graph_wrapper.h Fri Apr 30 16:46:19 2004 +0000 +++ b/src/work/marci/graph_wrapper.h Fri Apr 30 17:10:01 2004 +0000 @@ -11,7 +11,7 @@ ///\author Marton Makai #include -#include +//#include namespace hugo {