-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdsu.cpp
More file actions
72 lines (61 loc) · 1.38 KB
/
dsu.cpp
File metadata and controls
72 lines (61 loc) · 1.38 KB
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
struct Dsu {
int par[N];
Dsu() { memset(par, -1, sizeof par); }
int root(int v) {
return par[v] < 0 ? v : par[v] = root(par[v]);
}
bool fri(int v, int u) {
return root(v) == root(u);
}
bool merge(int v, int u) {
if ((v = root(v)) == (u = root(u)))
return false;
par[u] += par[v];
par[v] = u;
return true;
}
} dsu;
struct Dsu{
int par[maxn];
Dsu(){ memset(par, -1, sizeof par); }
int root(int v){
return par[v] == -1 ? v : par[v] = root(par[v]);
}
bool fri(int v, int u){
return root(v) == root(u);
}
bool merge(int v, int u){
return (v = root(v)) == (u = root(u)) ? 0 : (par[v] = u, 1);
}
} dsu;
struct Dsu{
int par[maxn];
vector<pair<int, int> > history;
vector<int> records;
Dsu(){ memset(par, -1, sizeof par); }
void record(){ records.push_back(history.size()); }
void undo(){
assert(records.size());
int when = records.back(); records.pop_back();
while(history.size() > when){
int u = history.back().first, sz = history.back().second, v = par[u];
par[v] -= sz, par[u] = sz;
history.pop_back();
}
}
int root(int v){
while(par[v] >= 0) v = par[v];
return v;
}
bool fri(int v, int u){
return root(v) == root(u);
}
bool merge(int v, int u){
v = root(v), u = root(u);
if(v == u) return 0;
if(par[v] > par[u]) swap(v, u);
history.push_back({u, par[u]});
par[v] += par[u], par[u] = v;
return 1;
}
} dsu;