-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdisjoin-set.cpp
64 lines (49 loc) · 1.19 KB
/
disjoin-set.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
#include <bits/stdc++.h>
using namespace std;
// Crio dois ponteiros que server para apontar para
// uma array de v inteiros, um contem o id de cada v
// o outro contem o pai do vertice
int *ids;
int *parents;
// Essa funcao cria a memoria dos arrays
// e inicia cada um a partir do 0
void makeSet(int size){
int i;
ids = new int[size];
parents = new int[size];
for(i = 0; i < size; ++i){
ids[i] = i;
parents[i] = i;
}
}
// Essa funcao acha o parent de um elemento
// ela acessa o array parent e caso ele n seja x
// ele procura pelo parent do x
int findSet(int x){
if(parents[x] == x)
return x;
else
return findSet(parents[x]);
}
// Essa funcao junta dois elementos dos parents
// por ordem do menor parent
void unionSet(int x, int y){
int parentX, parentY;
parentX = findSet(x);
parentY = findSet(y);
if(parentX == parentY)
return;
if(parentX < parentY)
parents[parentY] = parentX;
else
parents[parentX] = parentY;
}
//Alguns testes
int main(){
makeSet(6);
unionSet(1, 5);
unionSet(2, 3);
unionSet(3, 5);
for(int i = 0; i < 6; i++)
cout << findSet(i) << endl;
}