蓝桥杯练习:合根植物

合根植物

原题链接:问题 1873: [蓝桥杯][2017年第八届真题]合根植物
解题思路:查询连通分支,使用并查集,参考讲解


import java.util.Scanner;


public class Main {
    static int[] f;//根集合

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int k = sc.nextInt();
        f=new int[n*m+1];
        for (int i = 0; i <= n * m; i++) {//初始化根集合
            f[i] = i;
        }
        for (int i = 0; i < k; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            join(a, b);//将ab连通
        }
        int cnt=0;
        for (int i = 1; i <f.length ; i++) {
            if(f[i]==i){
                cnt++;//计数连通分支数
            }

        }
        System.out.println(cnt);

        sc.close();
    }

    private static void join(int a, int b) {
    //找到a的根和b的根,若不同则使其相同,则两个分支连通
        int fa = find(a), fb = find(b);
        if (fa != fb) {
            f[fa] = fb;
        }
    }
	//带路径压缩的并查集
    private static int find(int x) {
        return x==f[x]?x:find(f[x]);
    }

}

发布了56 篇原创文章 · 获赞 1 · 访问量 2344

猜你喜欢

转载自blog.csdn.net/qq_44467578/article/details/104686457