-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path1697.cpp
More file actions
49 lines (41 loc) · 1.29 KB
/
Copy path1697.cpp
File metadata and controls
49 lines (41 loc) · 1.29 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
class UnionFind {
int n, cnt = n;
vector<int> root, size;
public:
UnionFind(int n) : n(n), root(n), size(n, 1) { iota(root.begin(), root.end(), 0); }
int find(int x) {
while (x != root[x])
x = root[x] = root[root[x]];
return x;
}
void join(int x, int y) {
x = find(x), y = find(y);
if (x != y) {
if (size[x] > size[y]) swap(x, y);
root[x] = y;
size[y] += size[x];
cnt--;
}
}
int count() { return cnt; }
bool connected(int x, int y) { return find(x) == find(y); }
};
class Solution {
public:
vector<bool> distanceLimitedPathsExist(int n, vector<vector<int>> &edges, vector<vector<int>> &queries) {
vector<bool> res(queries.size());
UnionFind uf(n);
for (int i = 0; i < queries.size(); ++i)
queries[i].push_back(i);
const auto cmp = [](auto &a, auto &b) { return a[2] < b[2]; };
sort(begin(queries), end(queries), cmp);
sort(begin(edges), end(edges), cmp);
int i = 0;
for (auto &q : queries) {
for (; i < edges.size() && edges[i][2] < q[2]; i++)
uf.join(edges[i][0], edges[i][1]);
res[q[3]] = uf.connected(q[0], q[1]);
}
return res;
}
};