0
点赞
收藏
分享

微信扫一扫

并查集练习-合根植物

程序猿不脱发2 2022-01-23 阅读 22

合根植物

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());
    }

}
举报

相关推荐

0 条评论