/
dsets.cpp
executable file
·78 lines (67 loc) · 1.15 KB
/
dsets.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "dsets.h"
/**
* The default constructor.
*/
DisjointSets::DisjointSets()
{
/**
* I don't know why this is here at all.
*/
}
/**
* This function creates n unconnected root nodes
* at the end of the vector.
*/
void DisjointSets::addelements(int num)
{
for(int i=0; i<num; i++)
elems.push_back(-1);
}
/**
* This function should compress paths, and works as described
* in lecture.
*/
int DisjointSets::find(int a)
{
if(elems[a]<0) return a;
return elems[a] = find(elems[a]);
}
/**
* Returns true, if all the elements of the forest have a
* common root.
*/
bool DisjointSets::isConnected()
{
int a = find(0);
for(int i=0; i<elems.size(); i++)
if(find(i) != a)
return false;
return true;
}
/**
* This function should be implemented as a union by size.
*/
void DisjointSets::setunion(int a, int b)
{
while(elems[a] >=0)
a = elems[a];
while(elems[b] >=0)
b = elems[b];
if(a==b) return;
int newSize = elems[a] + elems[b];
if(elems[a] <= elems[b]) {
elems[b] = a;
elems[a] = newSize;
}
else {
elems[a] = b;
elems[b] = newSize;
}
}
/**
* This clears the vector.
*/
void DisjointSets::clear()
{
elems.clear();
}