并查集基础模板(java实现)

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的根结点
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值