Disjoint sets
TBD: Intro
We present three succesive implementations (is it necessary?).
Implementation with simple MF-sets
TBD: Explain
c++
class DisjointSets {
vector<int> v;
// find operation
int find (int i) {
if (v[i] < 0) return i;
else return find(v[i]);
}
public:
/* Creates n disjoint sets. */
DisjointSets (int n)
: v(n, -1)
{ }
/* Finds the class of element i. */
int operator[] (int i) {
return find(i);
}
/* Merges the classes of elements i and j. */
void merge (int i, int j) {
v[i] = j;
}
};
Implementation with MF-sets by size
TBD: Explain
c++
class DisjointSets {
vector<int> v;
// find operation
int find (int i) {
if (v[i] < 0) return i;
else return find(v[i]);
}
public:
/* Creates n disjoint sets. */
DisjointSets (int n)
: v(n, -1)
{ }
/* Finds the class of element i. */
int operator[] (int i) {
return find(i);
}
/* Merges the classes of elements i and j. */
void merge (int i, int j) {
int ci = find(i);
int cj = find(j);
if (v[ci] > v[cj]) {
v[cj] += v[ci];
v[ci] = cj;
} else {
v[ci] += v[cj];
v[cj] = ci;
} }
};
Implementation with MF-sets by size and with path compression
TBD: Explain
c++
class DisjointSets {
vector<int> v;
// find operation (with path compression)
int find (int i) {
if (v[i] < 0) return i;
else return v[i] = find(v[i]);
}
public:
/* Creates n disjoint sets. */
DisjointSets (int n)
: v(n, -1)
{ }
/* Finds the class of element i. */
int operator[] (int i) {
return find(i);
}
/* Merges the classes of elements i and j. */
void merge (int i, int j) {
int ci = find(i);
int cj = find(j);
if (v[ci] > v[cj]) {
v[cj] += v[ci];
v[ci] = cj;
} else {
v[ci] += v[cj];
v[cj] = ci;
} }
};
Lliçons.jutge.org
Jordi Petit
© Universitat Politècnica de Catalunya, 2024