合根植物
1)题目(合根植物)
w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
2、输入描述
3、输出描述
4、示例
5、样例说明
其合根情况参考下图(注意:6也是一个连通子集)
6、解题思路
并查集
7、题解
public class Main {
private static int father[];
private static int find(int a) {
int x = a;
while (a != father[a]) {
a = father[a];
}
//进行路径压缩
while (x != father[x]) {
int temp = x;
x = father[x];
father[temp] = a;
}
return a;
}
private static void union(int a, int b) {
int fa = find(a);
int fb = find(b);
if (fa != fb) {
father[fa] = fb;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
father = new int[m * n + 1];
for (int i = 1; i <= m * n; ) {
father[i] = i++;
}
int k = scanner.nextInt();
for (int i = 0; i < k; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
union(a, b);
}
Set<Integer> set = new HashSet<>();
for (int i = 1; i <= m * n; i++) {
int fa = find(i);
set.add(fa);
}
System.out.println(set.size());
}
}