题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1272
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
DisjointSet disjointSet = new DisjointSet();
int count = 0;
boolean tree = true;
while (true) {
int number1 = Integer.parseInt(scn.next());
int number2 = Integer.parseInt(scn.next());
if (-1 == number1 && -1 == number2) {
break;
}
if (0 == number1 && 0 == number2) {
if (tree) {
for (int i = 0; i < disjointSet.getSIZE(); ++i) {
if (disjointSet.getRecordItem(i)
&& disjointSet.getFlagItem(i) == i) {
++count;
if (count > 1) {
break;
}
}
}
if (1 < count) {
System.out.println("No");
} else {
System.out.println("Yes");
}
} else {
System.out.println("No");
}
disjointSet = new DisjointSet();
count = 0;
tree = true;
continue;
}
if (tree) {
tree = disjointSet.union(number1 - 1, number2 - 1);
}
}
scn.close();
}
}
class DisjointSet {
private final int SIZE = 100001;
private int[] flag;
private boolean[] record;
private int find(int r) {
while (r != flag[r]) {
r = flag[r];
}
return r;
}
public DisjointSet() {
flag = new int[SIZE];
for (int i = 0; i < SIZE; ++i) {
flag[i] = i;
}
record = new boolean[SIZE];
}
public boolean union(int x, int y) {
record[x] = true;
record[y] = true;
boolean tree = true;
int xRoot = find(x);
int yRoot = find(y);
if (xRoot == yRoot) {
tree = false;
}
if (xRoot != yRoot) {
flag[yRoot] = xRoot;
}
return tree;
}
public int getSIZE() {
return SIZE;
}
public int getFlagItem(int i) {
return flag[i];
}
public boolean getRecordItem(int i) {
return record[i];
}
}