大家好,我是晴天学长,并查集的入门题,其中的知识点有路径压缩和合并,基本并查集的题目中都用到了快输快读,需要的小伙伴请自取哦!💪💪💪
1 )亲戚
2) .算法思路
- 接收数据N和M
- 建立N大小的p数组,由于亲戚的编号
- 路径压缩
- 合并
3).代码示例
package LanQiaoTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class 亲戚 {
static int[] p;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
String[] strings = in.readLine().split(" ");
int N = Integer.parseInt(strings[0]);
int M = Integer.parseInt(strings[1]);
p = new int[N + 1];
for (int i = 1; i < N + 1; i++) {
p[i] = i;
}
//组成亲戚
for (int i = 0; i < M; i++) {
strings = in.readLine().split(" ");
int x = Integer.parseInt(strings[0]);
int y = Integer.parseInt(strings[1]);
if (find(x) != find(y)) {
//路径压缩
p[find(x)] = find(y);
}
}
strings = in.readLine().split(" ");
int Q = Integer.parseInt(strings[0]);
for (int i = 0; i < Q; i++) {
strings = in.readLine().split(" ");
int a = Integer.parseInt(strings[0]);
int b = Integer.parseInt(strings[1]);
if (find(a) == find(b)) {
out.println("Yes");
} else {
out.println("No");
}
}
out.flush();
}
//查询根节点(要是没更新也没关系,反正查的是根节点),并路径压缩
private static int find(int x) {
if (x != p[x]) {
p[x] = find(p[x]);
}
return p[x];
}
}
4).总结
- 熟悉并查集的概念。
- 路径压缩的使用。