-----------刷点水题练习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]); } }