题目描述
并查集
1.初始化并查集的数组p ,for i in n :p[i] = i;
2.合并2个数,即merge(x,y)
3.查询&压缩路径 find(x)
4.用set保存连同块的数量
5.判断set的大小 等于1说明都连起来了
样例
import java.util.*;
public class Main{
public static int[]p;
public static void main(String[]args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int n = in.nextInt();
p = new int[n+1];
for ( int i = 0; i < n; ++i ) {
p[i+1] = i+1;
}
int m = in.nextInt();
for ( int i = 0; i < m; ++i ) {
int x = in.nextInt();
int y = in.nextInt();
merge(x,y);
}
Set<Integer> set = new HashSet();
for ( int i = 1; i <= n; ++i ) {
set.add(find(i));
}
if ( set.size() == 1 ) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
public static int find(int x) {
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
public static void merge(int x ,int y ){
int x_new = find(x);
int y_new = find(y);
p[x_new] = y_new;
}
}