https://ac.nowcoder.com/acm/problem/226370
import java.util.*;
public class Main {
static int[] arr;
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
arr=new int[n+1];
init_set(n);//初始化
while(m-->0) {
int x=scan.nextInt();
int y=scan.nextInt();
merge_set(x,y);//合并
}
int[] sum1=new int[n+1];
int sum2=0,maxx=0;
for(int i=1;i<=n;i++) {
if(arr[i]==i) {
sum2++;
}
sum1[find_set(i)]++;
maxx=Math.max(sum1[find_set(i)], maxx);
}
System.out.println(sum2+" "+maxx);
}
//并查集核心代码部分
//初始化
public static void init_set(int n) {
for(int i=1;i<=n;i++) {
arr[i]=i;
}
}
//查找
public static int find_set(int x) {
if(x!=arr[x]) {
arr[x]=find_set(arr[x]); //路径压缩优化,使在递归过程中,
//直接把arr[x]变为根结点,从而减少下一次查询的时间
}
return arr[x];
}
//合并
public static void merge_set(int x,int y) {
x=find_set(x);
y=find_set(y);
if(x!=y) {
arr[x]=arr[y]; //把y的根结点变成x的根结点
}
}
}
https://www.lanqiao.cn/problems/19873/learning/
import java.util.Scanner;
public class Main {
static int[] arr;
static int[] size; // 用于记录每个连通块的大小
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
arr = new int[n + 1];
size = new int[n + 1];
// 初始化
for (int i = 1; i <= n; i++) {
arr[i] = i;
size[i] = 1; // 初始时每个点所在连通块大小为 1
}
while (m-- > 0) {
String s = scan.next();
if (s.equals("C")) {
int a = scan.nextInt();
int b = scan.nextInt();
merge_set(a, b);
} else if (s.equals("Q1")) {
int a = scan.nextInt();
int b = scan.nextInt();
if (find_set(a) == find_set(b)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
} else if (s.equals("Q2")) {
int a = scan.nextInt();
int root = find_set(a);
System.out.println(size[root]);
}
}
}
// 查找
public static int find_set(int x) {
if (x != arr[x]) {
arr[x] = find_set(arr[x]);
}
return arr[x];
}
// 合并
public static void merge_set(int x, int y) {
x = find_set(x);
y = find_set(y);
if (x != y) {
arr[x] = arr[y]; // 把 y 的根节点变成 x 的根结点
size[y] += size[x]; // 更新连通块的大小
}
}
}
https://www.lanqiao.cn/problems/19874/learning/
import java.util.Scanner;
public class Main {
static int[] arr;
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
arr=new int[n+1];
//初始化
for(int i=1;i<=n;i++){
arr[i]=i;
}
while (m-->0){
String s=scan.next();
if(s.equals("M")){
int a=scan.nextInt();
int b=scan.nextInt();
merge_set(a,b);
}else if(s.equals("Q")){
int a=scan.nextInt();
int b=scan.nextInt();
if(find_set(a)==find_set(b)){
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
}
//查找
public static int find_set(int x){
if(x!=arr[x]){
arr[x]=find_set(arr[x]);
}
return arr[x];
}
//合并
public static void merge_set(int x,int y){
x=find_set(x);
y=find_set(y);
if(x!=y){
arr[x]=arr[y];//把y的根节点变成x的根结点
}
}
}