题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
package D0802;
import java.io.*;
public class HDU1272 {
final static int max = 100001;
static int[] set = new int[max];
static int[] height = new int[max];
static int[] f = new int[max];
static int flag = 1;
// 初始化集合
public static void init() {
for (int i = 1; i < max; i++) {
set[i] = i;
f[i] = 0;
height[i] = 1;
}
}
// 查找x属于哪个集合
public static int find(int x) {
while (set[x] != x)
x = set[x];
return x;
}
// 合并集合
public static void merge(int a, int b) {
if (height[a] < height[b])
set[a] = b;
else if (height[a] > height[b])
set[b] = a;
else {
set[b] = a;
height[a]++;
}
}
public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(
new InputStreamReader(System.in)));
while (st.nextToken() != StreamTokenizer.TT_EOF) {
int a = (int) st.nval;
st.nextToken();
int b = (int) st.nval;
if (a == -1 && b == -1)break;
if (a == 0 && b == 0) {System.out.println("Yes");continue;}
init();
f[a] = f[b] = 1;
flag=1;
a = find(a);
b = find(b);
if (a != b)
merge(a, b);
else //存在环
flag = 0;
while (true) {
st.nextToken();
a = (int) st.nval;
st.nextToken();
b = (int) st.nval;
if (a == 0 && b == 0)
break;
a = find(a);
b = find(b);
if(a!=b)
merge(a, b);
else //存在环
flag = 0;
f[a] = f[b] = 1;
}
int k = 0;
for (int i = 1; i < max; i++) {
if (f[i]==1 && set[i] == i)
k++;
if(k>1){flag = 0;break;}
}
if (flag==1)
System.out.println("Yes");
else
System.out.println("No");
}
}
}