[Lemon-commits] [lemon_svn] beckerjc: r346 - hugo/trunk/src/work/johanna

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:38:55 CET 2006


Author: beckerjc
Date: Fri Mar 26 14:59:59 2004
New Revision: 346

Modified:
   hugo/trunk/src/work/johanna/kruskal.h
   hugo/trunk/src/work/johanna/kruskal_test.cc

Log:
koztes valtozat


Modified: hugo/trunk/src/work/johanna/kruskal.h
==============================================================================
--- hugo/trunk/src/work/johanna/kruskal.h	(original)
+++ hugo/trunk/src/work/johanna/kruskal.h	Fri Mar 26 14:59:59 2004
@@ -7,8 +7,61 @@
 
 namespace hugo {
 
+  template <typename Graph, typename EdgeCostMap, typename RetEdgeBoolMap>
+  typename EdgeCostMap::ValueType
+  kruskal1(Graph const& G, EdgeCostMap const& edge_costs,
+	   RetEdgeBoolMap &ret_bool_map);
 
-  template <typename Graph, typename EdgeCostMap, typename EdgeBoolMap>
+  template <typename Graph, typename EdgeCostMap, typename RetIterator>
+  typename EdgeCostMap::ValueType
+  kruskal2(Graph const& G, EdgeCostMap const& edge_costs,
+	   RetIterator ret_iterator);
+
+  // FIXME: ret_iterator nem lehet referencia!!!
+
+  template <typename Graph, typename EdgeCostPairVec, typename RetEdgeBoolMap>
+  typename EdgeCostPairVec::value_type::second_type
+  kruskal3(Graph const& G, EdgeCostPairVec const& edge_cost_pair_vec,
+	   RetEdgeBoolMap &ret_bool_map);
+
+  template <typename Graph, typename EdgeCostPairVec, typename RetIterator>
+  typename EdgeCostPairVec::value_type::second_type
+  kruskal4(Graph const& G, EdgeCostPairVec const& edge_cost_pair_vec,
+	   RetIterator &ret_iterator);
+
+  template <typename Graph, typename EdgePairVec, typename RetEdgeBoolMap>
+  int
+  kruskal5(Graph const& G, EdgePairVec const& edge_pair_vec,
+	   RetEdgeBoolMap &ret_bool_map);
+
+  template <typename Graph, typename EdgePairVec, typename RetIterator>
+  int
+  kruskal6(Graph const& G, EdgePairVec const& edge_pair_vec,
+	   RetIterator &ret_iterator);
+
+
+  template <typename Graph, typename EdgeCostMap, typename RetEdgeBoolMap,
+	    typename RetIterator>
+  typename EdgeCostMap::ValueType
+  kruskal7(Graph const& G, EdgeCostMap const& edge_costs,
+	   RetEdgeBoolMap &ret_bool_map, RetIterator &ret_iterator);
+
+  template <typename Graph, typename EdgeCostPairVec, typename RetEdgeBoolMap,
+	    typename RetIterator>
+  typename EdgeCostPairVec::value_type::second_type
+  kruskal8(Graph const& G, EdgeCostPairVec const& edge_cost_pair_vec,
+	   RetEdgeBoolMap &ret_bool_map, RetIterator &ret_iterator);
+
+  template <typename Graph, typename EdgePairVec, typename RetEdgeBoolMap,
+	    typename RetIterator>
+  int
+  kruskal9(Graph const& G, EdgePairVec const& edge_pair_vec,
+	   RetEdgeBoolMap &ret_bool_map, RetIterator &ret_iterator);
+
+
+
+
+  template <typename Graph, typename InputEdgeOrder, typename OutputObserver>
   class MinCostTreeKruskal
   {
 
@@ -16,45 +69,22 @@
     typedef typename Graph::Edge Edge;
 
   public:
-    typedef typename EdgeCostMap::ValueType EdgeCost;
-    typedef std::pair<Edge, EdgeCost> EdgeCostPair;
-    typedef std::vector<EdgeCostPair> EdgeCostVector;
+    typedef typename InputEdgeOrder::ValueType EdgeCost;
     
   private:
     Graph const &G;
-    EdgeCostMap const &costmap;
-    EdgeBoolMap& treemap;
-    
-    //template <typename EdgeCostPair>
-    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<EdgeIt>(); 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<int> NodeIntMap;
       typedef typename Graph::Node Node;
@@ -62,22 +92,160 @@
       UnionFind<Node,NodeIntMap> 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 <typename BoolMap>
+  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 <typename Iterator>
+  class SequenceOutput {
+    Iterator ⁢
 
+  public:
+    SequenceOutput(Iterator &_it) : it(_it) {}
+
+    template<typename KeyType>
+    void setTrue(KeyType const& k) { *it=k; ++it; }
+    template<typename KeyType>
+    void setFalse(KeyType const& k) {}
+  };
+
+  template <typename BoolMap, typename Iterator>
+  class CombinedOutput : BoolMapOutput<BoolMap>, SequenceOutput<Iterator> {
+    typedef BoolMapOutput<BoolMap> BMO;
+    typedef SequenceOutput<Iterator> SO;
+  public:
+    CombinedOutput(BoolMap &_bm, Iterator &_it) :
+      BMO(_bm), SO(_it) {}
+
+    template<typename KeyType>
+    void setTrue(KeyType const& k) {
+      BMO::setTrue(k); 
+      SO::setTrue(k);
+    }
+    template<typename KeyType>
+    void setFalse(KeyType const& k) {
+      BMO::setFalse(k); 
+      SO::setFalse(k);      
+    }
+  };
+
+
+  /* ** ** InputSource -ok ** ** */
+
+  template<typename Key, typename Val>
+  class PairVec : public std::vector< std::pair<Key,Val> > {
+
+  public:
+    typedef std::vector< std::pair<Key,Val> > Parent;
+    typedef Key KeyType;
+    typedef Val ValueType;
+    typedef std::pair<Key,Val> 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<typename Graph, typename Map>
+    void readGraphEdgeMap(Graph const& G, Map const& m) {
+      typedef typename Graph::EdgeIt EdgeIt;
+
+      clear();
+      for (EdgeIt e=G.template first<EdgeIt>(); 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 Graph, typename EdgeCostMap, typename RetEdgeBoolMap>
+  typename EdgeCostMap::ValueType
+  kruskal1(Graph const& G, EdgeCostMap const& edge_costs,
+	   RetEdgeBoolMap &ret_bool_map) {
+    typedef BoolMapOutput<RetEdgeBoolMap> OutObs;
+    OutObs out(ret_bool_map);
+
+    typedef PairVec<typename Graph::Edge, typename EdgeCostMap::ValueType>
+      InputVec;
+    InputVec iv;
+    iv.readGraphEdgeMap(G, edge_costs);
+
+    MinCostTreeKruskal<Graph,InputVec,OutObs> mctk(G, iv, out);
+    return mctk.run();
+  }
+
+  template <typename Graph, typename EdgeCostMap, typename RetIterator>
+  typename EdgeCostMap::ValueType
+  kruskal2(Graph const& G, EdgeCostMap const& edge_costs,
+	   RetIterator ret_iterator) {
+    typedef SequenceOutput<RetIterator> OutObs;
+    OutObs out(ret_iterator);
+
+    typedef PairVec<typename Graph::Edge, typename EdgeCostMap::ValueType>
+      InputVec;
+    InputVec iv;
+    iv.readGraphEdgeMap(G, edge_costs);
+
+    MinCostTreeKruskal<Graph,InputVec,OutObs> mctk(G, iv, out);
+    return mctk.run();    
+  }
+
 
 } //namespace hugo
 

Modified: hugo/trunk/src/work/johanna/kruskal_test.cc
==============================================================================
--- hugo/trunk/src/work/johanna/kruskal_test.cc	(original)
+++ hugo/trunk/src/work/johanna/kruskal_test.cc	Fri Mar 26 14:59:59 2004
@@ -1,6 +1,7 @@
 #include <string>
 #include <iostream>
 #include <map>
+#include <vector>
 
 #include <kruskal.h>
 #include <list_graph.h>
@@ -68,31 +69,61 @@
   ECostMap edge_cost_map(G, 2);
   EBoolMap tree_map(G);
   
-  typedef MinCostTreeKruskal<ListGraph, ECostMap, EBoolMap> 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;
+
+
+  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);
+
+  vector<Edge> tree_edge_vec;
+
+  cout << "Nemkonst koltseggel (-31): "
+       << kruskal2(G, edge_cost_map, back_inserter(tree_edge_vec))
+       << endl;
+
+  int i = 1;
+  for(vector<Edge>::iterator e = tree_edge_vec.begin();
+      e != tree_edge_vec.end(); ++e, ++i) {
+    cout << i << ". el: " << *e << endl;
+  }
+
+
+//   typedef MinCostTreeKruskal<ListGraph, ECostMap, EBoolMap> MCTK;
+
+//   MCTK mctk(G, edge_cost_map, tree_map);
+//   double k0lts = mctk.run();
 
-  cout << "Uniform 2-es koltseggel: " << k0lts << endl;
+//   cout << "Uniform 2-es koltseggel: " << k0lts << endl;
 
-  // Max koltsegu fa szamitasa elore megrendezett koltseg vektorbol:
-  typedef MinCostTreeKruskal<ListGraph, DummyMap<Edge,int>, EBoolMap> MCTK2;
-  MCTK2 mctk2(G, DummyMap<Edge,int>(), 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;
+//   // Max koltsegu fa szamitasa elore megrendezett koltseg vektorbol:
+//   typedef MinCostTreeKruskal<ListGraph, DummyMap<Edge,int>, EBoolMap> MCTK2;
+//   MCTK2 mctk2(G, DummyMap<Edge,int>(), 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;



More information about the Lemon-commits mailing list