并查集练习-合根植物
作者:互联网
合根植物
1)题目(合根植物)
w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
2、输入描述
输入格式
第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。
接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)
接下来k行,第2+k行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。
格子的编号一行一行,从上到下,从左到右编号。
比如:5 * 4 的小格子,编号:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
3、输出描述
输出一个整数,表示这个园中合根植物的数量
4、示例
输入
5 4 16 2 3 1 5 5 9 4 8 7 8 9 10 10 11 11 12 10 14 12 16 14 18 17 18 15 19 19 20 9 13 13 17
输出
5
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());
}
}
标签:合根,scanner,fa,int,查集,father,练习,nextInt 来源: https://blog.csdn.net/weixin_44957145/article/details/122650989