[Lemon-commits] [lemon_svn] beckerjc: r314 - hugo/trunk/src/work/johanna
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:38:40 CET 2006
Author: beckerjc
Date: Sat Mar 20 18:01:45 2004
New Revision: 314
Modified:
hugo/trunk/src/work/johanna/Makefile
hugo/trunk/src/work/johanna/kruskal.h
hugo/trunk/src/work/johanna/kruskal_test.cc
hugo/trunk/src/work/johanna/unionfind.h
Log:
unionfind: componentSize tagfv
kruskal: osztalyositva; lehet beadni sajat elorendezett el-koltseg vektort
nem tul elegans megoldas...
Modified: hugo/trunk/src/work/johanna/Makefile
==============================================================================
--- hugo/trunk/src/work/johanna/Makefile (original)
+++ hugo/trunk/src/work/johanna/Makefile Sat Mar 20 18:01:45 2004
@@ -1,4 +1,4 @@
BINARIES = kruskal_test
-INCLUDEDIRS= -I. -I.. -I../../include
+INCLUDEDIRS= -I. -I.. -I../../include -I../{marci,jacint,alpar,klao,akos}
include ../makefile
Modified: hugo/trunk/src/work/johanna/kruskal.h
==============================================================================
--- hugo/trunk/src/work/johanna/kruskal.h (original)
+++ hugo/trunk/src/work/johanna/kruskal.h Sat Mar 20 18:01:45 2004
@@ -7,52 +7,76 @@
namespace hugo {
- template <typename EdgeCostPair> static
- bool comparePair(EdgeCostPair const& a, EdgeCostPair const& b) {
- return a.second < b.second;
- }
+ template <typename Graph, typename EdgeCostMap, typename EdgeBoolMap>
+ class MinCostTreeKruskal
+ {
- template <typename Graph, typename EdgeDoubleMap, typename EdgeBoolMap>
+ typedef typename Graph::EdgeIt EdgeIt;
+ typedef typename Graph::Edge Edge;
- typename EdgeDoubleMap::ValueType
- MinCostTreeKruskal(Graph const& G, EdgeDoubleMap const& costmap,
- EdgeBoolMap& treemap)
- {
+ public:
+ typedef typename EdgeCostMap::ValueType EdgeCost;
+ typedef std::pair<Edge, EdgeCost> EdgeCostPair;
+ typedef std::vector<EdgeCostPair> EdgeCostVector;
+
+ private:
+ Graph const &G;
+ EdgeCostMap const &costmap;
+ EdgeBoolMap& treemap;
- typedef typename EdgeDoubleMap::ValueType EDouble;
- typedef typename Graph::EachEdgeIt EachEdgeIt;
- typedef std::pair<EachEdgeIt, EDouble> EdgeCostPair;
+ //template <typename EdgeCostPair>
+ class comparePair {
+ public:
+ bool operator()(EdgeCostPair const& a, EdgeCostPair const& b) {
+ return a.second < b.second;
+ }
+ };
+ public:
- typedef std::vector<EdgeCostPair> EdgeCostVector;
- EdgeCostVector rank;
- for (EachEdgeIt e=G.template first<EachEdgeIt>(); e.valid(); ++e) {
- rank.push_back(make_pair(e, costmap.get(e)));
- }
+ MinCostTreeKruskal(Graph const& _G, EdgeCostMap const& _costmap,
+ EdgeBoolMap& _treemap) : G(_G), costmap(_costmap),
+ treemap(_treemap) {}
+
+ 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);
- std::sort(rank.begin(), rank.end(), comparePair<EdgeCostPair>);
+ }
- typedef typename Graph::NodeMap<int> NodeIntMap;
- typedef typename Graph::NodeIt NodeIt;
- NodeIntMap comp_map(G, -1);
- UnionFind<NodeIt,NodeIntMap> uf(comp_map);
-
- EDouble tot_cost = 0;
- for (typename EdgeCostVector::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;
- }
- else {
- treemap.set(p->first, false);
+ EdgeCost run(EdgeCostVector const &rank)
+ {
+ typedef typename Graph::NodeMap<int> NodeIntMap;
+ typedef typename Graph::Node Node;
+ NodeIntMap comp_map(G, -1);
+ 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;
+ }
+ else {
+ treemap.set(p->first, false);
+ }
}
+ return tot_cost;
+
}
- return tot_cost;
- }
+
+ };
} //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 Sat Mar 20 18:01:45 2004
@@ -3,7 +3,7 @@
#include <map>
#include <kruskal.h>
-#include <list_graph.hh>
+#include <list_graph.h>
using namespace std;
@@ -25,39 +25,75 @@
};
+// Egy olyan "map", ami nem tud semmit, csak a typedef-eket.
+// Valami elegansabb megoldas kene a Kruskalban...
+
+template <typename K, typename V>
+class DummyMap {
+public:
+ typedef K KeyType;
+ typedef V ValueType;
+};
+
int main() {
+ typedef ListGraph::Node Node;
+ typedef ListGraph::Edge Edge;
typedef ListGraph::NodeIt NodeIt;
typedef ListGraph::EdgeIt EdgeIt;
- typedef ListGraph::EachNodeIt EachNodeIt;
- typedef ListGraph::EachEdgeIt EachEdgeIt;
ListGraph G;
- NodeIt s=G.addNode();
- NodeIt v1=G.addNode();
- NodeIt v2=G.addNode();
- NodeIt v3=G.addNode();
- NodeIt v4=G.addNode();
- NodeIt t=G.addNode();
+ Node s=G.addNode();
+ Node v1=G.addNode();
+ Node v2=G.addNode();
+ Node v3=G.addNode();
+ Node v4=G.addNode();
+ Node t=G.addNode();
- G.addEdge(s, v1);
- G.addEdge(s, v2);
- G.addEdge(v1, v2);
- G.addEdge(v2, v1);
- G.addEdge(v1, v3);
- G.addEdge(v3, v2);
- G.addEdge(v2, v4);
- G.addEdge(v4, v3);
- G.addEdge(v3, t);
- G.addEdge(v4, t);
+ Edge e1 = G.addEdge(s, v1);
+ Edge e2 = G.addEdge(s, v2);
+ Edge e3 = G.addEdge(v1, v2);
+ Edge e4 = G.addEdge(v2, v1);
+ Edge e5 = G.addEdge(v1, v3);
+ Edge e6 = G.addEdge(v3, v2);
+ Edge e7 = G.addEdge(v2, v4);
+ Edge e8 = G.addEdge(v4, v3);
+ Edge e9 = G.addEdge(v3, t);
+ Edge e10 = G.addEdge(v4, t);
- ListGraph::EdgeMap<double> edge_cost_map(G, 2);
- ListGraph::EdgeMap<bool> tree_map(G);
+ typedef ListGraph::EdgeMap<double> ECostMap;
+ typedef ListGraph::EdgeMap<bool> EBoolMap;
+
+ ECostMap edge_cost_map(G, 2);
+ EBoolMap tree_map(G);
- double k0lts = MinCostTreeKruskal(G, edge_cost_map, tree_map);
+ 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;
+
+ // 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;
- cout << k0lts << endl;
return 0;
}
Modified: hugo/trunk/src/work/johanna/unionfind.h
==============================================================================
--- hugo/trunk/src/work/johanna/unionfind.h (original)
+++ hugo/trunk/src/work/johanna/unionfind.h Sat Mar 20 18:01:45 2004
@@ -1,6 +1,6 @@
// -*- c++ -*- //
-#ifndef UNION_FIND_H
-#define UNION_FIND_H
+#ifndef HUGO_UNION_FIND_H
+#define HUGO_UNION_FIND_H
#include <vector>
#include <utility>
@@ -68,8 +68,14 @@
return true;
}
+ int componentSize(T a)
+ {
+ int ca = whichComponent(a);
+ return data[ca].second;
+ }
+
};
} //namespace hugo
-#endif //UNION_FIND_H
+#endif //HUGO_UNION_FIND_H
More information about the Lemon-commits
mailing list