大家好,我是晴天学长,并查集的入门题,其中的知识点有路径压缩和合并,需要的小伙伴请自取哦!💪💪💪
1 )蓝桥幼儿园
2) .算法思路
- 接收数据N和M
- 建立N大小的p数组,由于孩子们的编号
- 路径压缩
- 合并
3).代码示例
package LanQiaoTest.并查集;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class 蓝桥幼儿园 {
static int[] p;
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
String[] scanner = in.readLine().split(" ");
int N = Integer.parseInt(scanner[0]);
p = new int[N + 1];
for (int i = 1; i < N + 1; i++) {
p[i] = i;
}
int M = Integer.parseInt(scanner[1]);
for (int i = 0; i < M; i++) {
scanner = in.readLine().split(" ");
if (Integer.parseInt(scanner[0]) == 1) {
int x = Integer.parseInt(scanner[1]);
int y = Integer.parseInt(scanner[2]);
merge(x, y);
} else {
int x = Integer.parseInt(scanner[1]);
int y = Integer.parseInt(scanner[2]);
String ans = find(x) == find(y) ? "YES" : "NO";
out.println(ans);
}
}
out.flush();
}
//查找根节点和路径压缩
private static int find(int x) {
if (x != p[x]) {
//已经是路径压缩了,每在根节点添加一次父节点的时候,下次查询就会自动更新自己的根节点
p[x] = find(p[x]);
}
return p[x];
}
//合并
private static void merge(int x, int y) {
int a = find(x);
int b = find(y);
if (a != b) {
p[a] = b;
}
}
}
4).总结
- 熟悉并查集的概念。