# HG changeset patch # User beckerjc # Date 1080309599 0 # Node ID dc95ca4ebc7bf38862aa81d764f6de5b02648294 # Parent 317b98ee85831bf431b25e60fdafe7583cd170ea koztes valtozat diff -r 317b98ee8583 -r dc95ca4ebc7b src/work/johanna/kruskal.h --- a/src/work/johanna/kruskal.h Fri Mar 26 13:03:09 2004 +0000 +++ b/src/work/johanna/kruskal.h Fri Mar 26 13:59:59 2004 +0000 @@ -7,8 +7,61 @@ namespace hugo { + template + typename EdgeCostMap::ValueType + kruskal1(Graph const& G, EdgeCostMap const& edge_costs, + RetEdgeBoolMap &ret_bool_map); - template + template + typename EdgeCostMap::ValueType + kruskal2(Graph const& G, EdgeCostMap const& edge_costs, + RetIterator ret_iterator); + + // FIXME: ret_iterator nem lehet referencia!!! + + template + typename EdgeCostPairVec::value_type::second_type + kruskal3(Graph const& G, EdgeCostPairVec const& edge_cost_pair_vec, + RetEdgeBoolMap &ret_bool_map); + + template + typename EdgeCostPairVec::value_type::second_type + kruskal4(Graph const& G, EdgeCostPairVec const& edge_cost_pair_vec, + RetIterator &ret_iterator); + + template + int + kruskal5(Graph const& G, EdgePairVec const& edge_pair_vec, + RetEdgeBoolMap &ret_bool_map); + + template + int + kruskal6(Graph const& G, EdgePairVec const& edge_pair_vec, + RetIterator &ret_iterator); + + + template + typename EdgeCostMap::ValueType + kruskal7(Graph const& G, EdgeCostMap const& edge_costs, + RetEdgeBoolMap &ret_bool_map, RetIterator &ret_iterator); + + template + typename EdgeCostPairVec::value_type::second_type + kruskal8(Graph const& G, EdgeCostPairVec const& edge_cost_pair_vec, + RetEdgeBoolMap &ret_bool_map, RetIterator &ret_iterator); + + template + int + kruskal9(Graph const& G, EdgePairVec const& edge_pair_vec, + RetEdgeBoolMap &ret_bool_map, RetIterator &ret_iterator); + + + + + template class MinCostTreeKruskal { @@ -16,45 +69,22 @@ typedef typename Graph::Edge Edge; public: - typedef typename EdgeCostMap::ValueType EdgeCost; - typedef std::pair EdgeCostPair; - typedef std::vector EdgeCostVector; + typedef typename InputEdgeOrder::ValueType EdgeCost; private: Graph const &G; - EdgeCostMap const &costmap; - EdgeBoolMap& treemap; - - //template - class comparePair { - public: - bool operator()(EdgeCostPair const& a, EdgeCostPair const& b) { - return a.second < b.second; - } - }; + InputEdgeOrder const &edges; + OutputObserver &out_obs; public: - MinCostTreeKruskal(Graph const& _G, EdgeCostMap const& _costmap, - EdgeBoolMap& _treemap) : G(_G), costmap(_costmap), - treemap(_treemap) {} + MinCostTreeKruskal(Graph const& _G, InputEdgeOrder const& _edges, + OutputObserver& _out_obs) : + G(_G), edges(_edges), out_obs(_out_obs) {} - EdgeCost run() - { - EdgeCostVector rank; - for (EdgeIt e=G.template first(); G.valid(e); G.next(e)) { - rank.push_back(make_pair(e, costmap.get(e))); - } - - std::sort(rank.begin(), rank.end(), comparePair()); - - return run(rank); - - } - - EdgeCost run(EdgeCostVector const &rank) + EdgeCost run() { typedef typename Graph::NodeMap NodeIntMap; typedef typename Graph::Node Node; @@ -62,22 +92,160 @@ UnionFind uf(comp_map); EdgeCost tot_cost = 0; - for (typename EdgeCostVector::const_iterator p = rank.begin(); - p!=rank.end(); ++p ) { - if ( uf.joinComponents(G.head(p->first), G.tail(p->first)) ) { - treemap.set(p->first, true); - tot_cost += p->second; + for (typename InputEdgeOrder::const_iterator p = edges.begin(); + p!=edges.end(); ++p ) { + if ( uf.joinComponents(G.head(edges.first(p)), + G.tail(edges.first(p))) ) { + out_obs.setTrue(edges.first(p)); + tot_cost += edges.second(p); } else { - treemap.set(p->first, false); + out_obs.setFalse(edges.first(p)); } } return tot_cost; - } }; + + /* ** ** Output-objektumok (Observerek (?)) ** ** */ + + template + class BoolMapOutput { + BoolMap &bm; + typedef typename BoolMap::KeyType KeyType; + + public: + BoolMapOutput(BoolMap &_bm) : bm(_bm) {} + + void setTrue(KeyType const& k) { bm.set(k, true); } + void setFalse(KeyType const& k) { bm.set(k, false); } + }; + + template + class SequenceOutput { + Iterator ⁢ + + public: + SequenceOutput(Iterator &_it) : it(_it) {} + + template + void setTrue(KeyType const& k) { *it=k; ++it; } + template + void setFalse(KeyType const& k) {} + }; + + template + class CombinedOutput : BoolMapOutput, SequenceOutput { + typedef BoolMapOutput BMO; + typedef SequenceOutput SO; + public: + CombinedOutput(BoolMap &_bm, Iterator &_it) : + BMO(_bm), SO(_it) {} + + template + void setTrue(KeyType const& k) { + BMO::setTrue(k); + SO::setTrue(k); + } + template + void setFalse(KeyType const& k) { + BMO::setFalse(k); + SO::setFalse(k); + } + }; + + + /* ** ** InputSource -ok ** ** */ + + template + class PairVec : public std::vector< std::pair > { + + public: + typedef std::vector< std::pair > Parent; + typedef Key KeyType; + typedef Val ValueType; + typedef std::pair PairType; + + typedef typename Parent::iterator iterator; + typedef typename Parent::const_iterator const_iterator; + + + private: + + class comparePair { + public: + bool operator()(PairType const& a, PairType const& b) { + return a.second < b.second; + } + }; + + public: + + // FIXME: kell ez? + // PairVec(Parent const& p) : Parent(p) {} + + void sort() { + std::sort(begin(), end(), comparePair()); + } + + // FIXME: nem nagyon illik ez ide... + template + void readGraphEdgeMap(Graph const& G, Map const& m) { + typedef typename Graph::EdgeIt EdgeIt; + + clear(); + for (EdgeIt e=G.template first(); G.valid(e); G.next(e)) { + push_back(make_pair(e, m[e])); + } + + sort(); + } + + int alma() { return 5; /* FIXME */ } + + Key const& first(const_iterator i) const { return i->first; } + Key& first(iterator i) { return i->first; } + + Val const& second(const_iterator i) const { return i->second; } + Val& second(iterator i) { return i->second; } + }; + + /* ** ** Wrapper fuggvenyek ** ** */ + + template + typename EdgeCostMap::ValueType + kruskal1(Graph const& G, EdgeCostMap const& edge_costs, + RetEdgeBoolMap &ret_bool_map) { + typedef BoolMapOutput OutObs; + OutObs out(ret_bool_map); + + typedef PairVec + InputVec; + InputVec iv; + iv.readGraphEdgeMap(G, edge_costs); + + MinCostTreeKruskal mctk(G, iv, out); + return mctk.run(); + } + + template + typename EdgeCostMap::ValueType + kruskal2(Graph const& G, EdgeCostMap const& edge_costs, + RetIterator ret_iterator) { + typedef SequenceOutput OutObs; + OutObs out(ret_iterator); + + typedef PairVec + InputVec; + InputVec iv; + iv.readGraphEdgeMap(G, edge_costs); + + MinCostTreeKruskal mctk(G, iv, out); + return mctk.run(); + } + } //namespace hugo diff -r 317b98ee8583 -r dc95ca4ebc7b src/work/johanna/kruskal_test.cc --- a/src/work/johanna/kruskal_test.cc Fri Mar 26 13:03:09 2004 +0000 +++ b/src/work/johanna/kruskal_test.cc Fri Mar 26 13:59:59 2004 +0000 @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -68,31 +69,61 @@ ECostMap edge_cost_map(G, 2); EBoolMap tree_map(G); - typedef MinCostTreeKruskal MCTK; - MCTK mctk(G, edge_cost_map, tree_map); - double k0lts = mctk.run(); + cout << "Uniform 2-es koltseggel: " + << kruskal1(G, edge_cost_map, tree_map) + << endl; - cout << "Uniform 2-es koltseggel: " << k0lts << endl; - // Max koltsegu fa szamitasa elore megrendezett koltseg vektorbol: - typedef MinCostTreeKruskal, EBoolMap> MCTK2; - MCTK2 mctk2(G, DummyMap(), tree_map); - MCTK2::EdgeCostVector ecv; - ecv.push_back(make_pair(e1, 10)); - ecv.push_back(make_pair(e2, 9)); - ecv.push_back(make_pair(e3, 8)); - ecv.push_back(make_pair(e4, 7)); - ecv.push_back(make_pair(e5, 6)); - ecv.push_back(make_pair(e6, 5)); - ecv.push_back(make_pair(e7, 4)); - ecv.push_back(make_pair(e8, 3)); - ecv.push_back(make_pair(e9, 2)); - ecv.push_back(make_pair(e10, 1)); + edge_cost_map.set(e1, -10); + edge_cost_map.set(e2, -9); + edge_cost_map.set(e3, -8); + edge_cost_map.set(e4, -7); + edge_cost_map.set(e5, -6); + edge_cost_map.set(e6, -5); + edge_cost_map.set(e7, -4); + edge_cost_map.set(e8, -3); + edge_cost_map.set(e9, -2); + edge_cost_map.set(e10, -1); - k0lts = mctk2.run(ecv); - cout << "Max koltsegu fa elore megrendezett koltseg vektorbol: 31 = " - << k0lts << endl; + vector tree_edge_vec; + + cout << "Nemkonst koltseggel (-31): " + << kruskal2(G, edge_cost_map, back_inserter(tree_edge_vec)) + << endl; + + int i = 1; + for(vector::iterator e = tree_edge_vec.begin(); + e != tree_edge_vec.end(); ++e, ++i) { + cout << i << ". el: " << *e << endl; + } + + +// typedef MinCostTreeKruskal MCTK; + +// MCTK mctk(G, edge_cost_map, tree_map); +// double k0lts = mctk.run(); + +// cout << "Uniform 2-es koltseggel: " << k0lts << endl; + +// // Max koltsegu fa szamitasa elore megrendezett koltseg vektorbol: +// typedef MinCostTreeKruskal, EBoolMap> MCTK2; +// MCTK2 mctk2(G, DummyMap(), tree_map); +// MCTK2::EdgeCostVector ecv; +// ecv.push_back(make_pair(e1, 10)); +// ecv.push_back(make_pair(e2, 9)); +// ecv.push_back(make_pair(e3, 8)); +// ecv.push_back(make_pair(e4, 7)); +// ecv.push_back(make_pair(e5, 6)); +// ecv.push_back(make_pair(e6, 5)); +// ecv.push_back(make_pair(e7, 4)); +// ecv.push_back(make_pair(e8, 3)); +// ecv.push_back(make_pair(e9, 2)); +// ecv.push_back(make_pair(e10, 1)); + +// k0lts = mctk2.run(ecv); +// cout << "Max koltsegu fa elore megrendezett koltseg vektorbol: 31 = " +// << k0lts << endl; return 0;