HDU1213:How Many Tables(并查集入门)

-----------刷点水题练习java-------------

题意:给定N点,M边的无向图,问有多少个连通块。

思路:可以搜索;  可以并查集。这里用并查集练习java的数组使用,ans=N,合并一个连通块ans--; 以及函数的调用

         经验1:C++声明数组是int fa[1024];而java则是int[] fa=new int[1024];

        经验2:不加static是非静态函数,访问需要new出该类的对象来调用,加上static是静态函数 可直接访问或者通过类名访问。

import java.util.Scanner;

/*
@author nimphy
@create 2019-11-04-16:14
about:
*/
public class Main {
    static int[] fa = new int[1010];

    public static void main(String[] args) {
        Scanner scan;
        int N, M, ans, x, y, T;
        scan = new Scanner(System.in);
        T = scan.nextInt();
        while (T-- > 0) {
            N = scan.nextInt();
            M = scan.nextInt();
            ans = N;
            for (int i = 1; i <= N; i++) fa[i] = i;
            for (int i = 1; i <= M; i++) {
                x = scan.nextInt();
                y = scan.nextInt();
                x = find(x);
                y = find(y);
                if (x != y) {
                    fa[x] = y;
                    ans--;
                }
            }
            System.out.println(ans);
        }
    }

    static int find(int x) {
        if (x == fa[x]) return x;
        return fa[x] = find(fa[x]);
    }
}

 

你可能感兴趣的:(HDU1213:How Many Tables(并查集入门))