publicintfind(int a) { if (parent[a] == a) { return a; } return parent[a] = find(parent[a]); }
publicvoidunion(int a,int b) { intpa= find(a); intpb= find(b); if (pa == pb) return; parent[pa] = pb; }
classPair { int p, q; int limit; int idx; publicPair(int p, int q, int limit, int idx) { this.p = p; this.q = q; this.limit = limit; this.idx = idx; } }
publicboolean[] distanceLimitedPathsExist(int n, int[][] edge, int[][] q) { parent = newint[n]; for (inti=0; i < n; i++) parent[i] = i; boolean[] res = newboolean[q.length]; Pair[] query = newPair[q.length]; for (inti=0; i < q.length; i++) { query[i] = newPair(q[i][0], q[i][1], q[i][2], i); } Arrays.sort(edge, (e1, e2)->e1[2]-e2[2]); Arrays.sort(query, (q1, q2)->q1.limit-q2.limit); intj=0; for (inti=0; i < query.length; i++) { while (j < edge.length && edge[j][2] < query[i].limit) { union(edge[j][0], edge[j][1]); j++; } res[query[i].idx] = find(query[i].p) == find(query[i].q); } return res; }
看了大佬们的代码后稍微做了下点简化
int[] parent;
publicintfind(int a) { if (parent[a] == a) return a; return parent[a] = find(parent[a]); }
publicvoidunion(int a,int b) { intpa= find(a); intpb= find(b); if (pa == pb) return; parent[pa] = pb; }
publicboolean[] distanceLimitedPathsExist(int n, int[][] edge, int[][] q) { parent = newint[n]; intqlen= q.length; for (inti=0; i < n; i++) parent[i] = i; boolean[] res = newboolean[qlen]; //记录 query 排序后的 id Integer[] qid = newInteger[qlen]; for (inti=0; i < qlen; i++) qid[i] = i; Arrays.sort(edge, (e1, e2)->e1[2]-e2[2]); Arrays.sort(qid, (i1, i2)->q[i1][2]-q[i2][2]); intj=0; for (inti=0; i < qlen; i++) { while (j < edge.length && edge[j][2] < q[qid[i]][2]) { union(edge[j][0], edge[j][1]); j++; } res[qid[i]] = find(q[qid[i]][0]) == find(q[qid[i]][1]); } return res; }