-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
37 lines (32 loc) · 1.03 KB
/
main.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
class Solution {
public:
long long countPairs(int n, vector<vector<int>>& edges) {
vector<int> sizes(n, 1);
vector<int> groups(n);
iota(groups.begin(), groups.end(), 0);
function<int(int)> find = [&](int u) -> int {
if (groups[u] == u) return u;
return groups[u] = find(groups[u]);
};
function<void(int, int)> unite = [&](int u, int v) -> void {
int pu = find(u);
int pv = find(v);
if (pu == pv) return;
if (sizes[pu] > sizes[pv]) {
groups[pv] = pu;
sizes[pu] += sizes[pv];
} else {
groups[pu] = pv;
sizes[pv] += sizes[pu];
}
};
for (const vector<int> e : edges) unite(e[0], e[1]);
long long result = 0, s = n;
vector<int> scc;
for (int i = 0; i < n; ++i) {
if (i != find(i)) continue;
result += (s -= sizes[i]) * sizes[i];
}
return result;
}
};