-
Notifications
You must be signed in to change notification settings - Fork 8
/
unionFindGraph.cpp
92 lines (72 loc) · 1.73 KB
/
unionFindGraph.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include"unionFindGraph.h"
#include"cmath"
// 返回第i个元素所在的联通区域的根节点
int UnionFind::findSetRoot(int i)
{
int index = i;
while(getParent(index) != eos_)
{
index = getParent(index);
}
return index;
}
// 将i和j 设置成相同的联通区域
void UnionFind::setUnion(int i, int j)
{
int rooti = findSetRoot(i);
int rootj = findSetRoot(j);
if(rooti< rootj)
{
setParent(rootj, rooti);
nSets_ --;
}
if(rooti> rootj) // 这里不应该存在相等的情况,因为相等表示i,j属于同一个联通区域,再进行设置的话
// 将根节点的父节点设置成了本身,而不是-1
{
setParent(rooti, rootj);
nSets_--;
}
}
// 获取第k个节点的根节点
int UnionFind::getKthSetRoot(int k)
{
int iter = 0;
int rootid = -1;
int elementNum = getElementNum();
for(int i=0; i< elementNum; i++)
{
if(getParent(i) == eos_)
{
if(iter == k)
{
rootid = i;
break;
}
iter++;
}
}
return rootid;
}
// 返回与i属于同一个联通区域的所有的节点// 第一个元素是根节点
vector<int> UnionFind::getSameSetElements(int iter)
{
vector<int> elemts;
int rooti = findSetRoot(iter);
int elementsNum = getElementNum();
elemts.push_back(rooti);
for(int i=0; i< elementsNum; i++)
{
if(i!= rooti && findSetRoot(i) == rooti)
{
elemts.push_back(i);
}
}
return elemts;
}
// 返回第k个联通区域的所有的元素
vector<int> UnionFind::getKthSetElements(int k)
{
int rooti = getKthSetRoot(k);
vector<int> elements = getSameSetElements(rooti);
return elements;
}