題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=1213
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int casesNumber = Integer.parseInt(scn.next());
while (0 <= --casesNumber) {
int pointsNumber = Integer.parseInt(scn.next());
DisjointSet disjointSet = new DisjointSet(pointsNumber);
int relationNumber = Integer.parseInt(scn.next());
while (0 <= --relationNumber) {
int x = Integer.parseInt(scn.next()) - 1;
int y = Integer.parseInt(scn.next()) - 1;
disjointSet.union(x, y);
}
System.out.println(disjointSet.calculateSetNumber());
}
scn.close();
}
}
class DisjointSet {
private int pointsNumber;
private int[] flag;
private int find(int r) {
while (r != flag[r]) {
r = flag[r];
}
return r;
}
public DisjointSet(int pointsNumber) {
this.pointsNumber = pointsNumber;
flag = new int[pointsNumber];
for (int i = 0; i < pointsNumber; ++i) {
flag[i] = i;
}
}
public int calculateSetNumber() {
int count = 0;
for (int i = 0; i < pointsNumber; ++i) {
if (flag[i] == i) {
++count;
}
}
return count;
}
public void union(int x, int y) {
int xRoot = find(x);
int yRoot = find(y);
if (xRoot != yRoot) {
flag[yRoot] = xRoot;
}
}
}