public boolean[] distanceLimitedPathsExist(int n, int[][] edgeList, int[][] queries) {
Arrays.sort(edgeList, (a, b) -> a[2] - b[2]);//边的权重排序
Integer[] index = new Integer[queries.length];
for (int i = 0; i < queries.length; i++) {
index[i] = i;
}
Arrays.sort(index, (a, b) -> queries[a][2] - queries[b][2]);//查询排序
int[] uf = new int[n];//并查集
for (int i = 0; i < n; i++) {
uf[i] = i;
}
boolean[] res = new boolean[queries.length];
int k = 0;
for (int i : index) {
//只要当前边权小于查询限制,那么加入图,后面的边一定不满足查询
while (k < edgeList.length && edgeList[k][2] < queries[i][2]) {
merge(uf, edgeList[k][0], edgeList[k][1]);
k++;
}
//所有满足条件的边已添加,只需两点查询是否连通
res[i] = find(uf, queries[i][0]) == find(uf, queries[i][1]);
}
return res;
}
public int find(int[] uf, int x) {
if (uf[x] == x) {
return x;
}
return uf[x] = find(uf, uf[x]);
}
public void merge(int[] uf, int x, int y) {
x = find(uf, x);
y = find(uf, y);
uf[y] = x;
}
并查集leetcode.1697
最新推荐文章于 2024-07-25 11:27:31 发布