7-1 并查集【模板】 (30 分)

本文深入探讨了并查集算法的实现与应用,通过具体示例讲解了如何使用递归和迭代方法进行集合的合并与查询操作。文章提供了完整的代码示例,并分析了不同场景下的数据规模与算法性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-1 并查集【模板】 (30 分)

给出一个并查集,请完成合并和查询操作。

输入格式:

第一行包含两个整数N、M,表示共有N个元素和M个操作。

接下来M行,每行包含三个整数Z​i​​、X​i​​、Y​i​​。

当Z​i​​=1时,将X​i​​与Y​i​​所在的集合合并。

当Z​i​​=2时,输出X​i​​与Y​i​​是否在同一集合内,是的话输出Y;否则的话输出N。

输出格式:

对于每一个Z​i​​=2的操作,对应一行输出,每行包含一个大写字母,为Y或者N。

输入样例:

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出样例:

N
Y
N
Y

数据规模:

对于30%的数据,N<=10,M<=20;
对于70%的数据,N<=100,M<=1000;
对于100%的数据,N<=10000,M<=200000。

递归(超时)

import java.util.Scanner;

public class Main {
    static Scanner demo=new Scanner(System.in);
	static int[] Arr;
	
	static int find(int A) {//递归
		if(A==Arr[A]) {
			return A;
		}
		return A=find(Arr[A]);
	}

	public static void main(String[] args) {
	    int X,Y,Z;
	    int p,q;

		int N=demo.nextInt();
		int M=demo.nextInt();
		
		Arr=new int[N+1];

		for(int i=0;i<N;i++) {
			Arr[i]=i;
		}
		
		for(int i=0;i<M;i++) {
			
			Z=demo.nextInt();
			X=demo.nextInt();
			Y=demo.nextInt();
			
        	p=find(X);
	        q=find(Y);
			if(Z==2) {
				

	            
				if(p==q) {
					System.out.println('Y');
					continue;
				}
				System.out.println('N');
			}else {

				if(p!=q) {
					Arr[p]=q;
				}
			}		
		}
	}
	
}

while循环(超时)

import java.util.Scanner;

public class Main{
	static int[] Arr;
	static int[] size;
	
	static int find(int A) {//while循环
		while(A!=Arr[A]) {
			A=Arr[A];
		}
		return Arr[A];
	}
	
	static void union(int p,int q) {
		if(p==q) {
			return;
		}
		if(size[p]>size[q]) {
			Arr[q]=p;
			size[p]+=size[q];
		}else{
			Arr[p]=q;
			size[q]+=size[p];
		}		
	}

	public static void main(String[] args) {
		Scanner demo=new Scanner(System.in);
		int X,Y,Z;
		int p,q;

		int N=demo.nextInt();
		int M=demo.nextInt();
		
		Arr=new int[N+1];
		size=new int[N];

		for(int i=0;i<N;i++) {
			Arr[i]=i;
			size[i]=1;
		}
		
		for(int i=0;i<M;i++) {
			
			Z=demo.nextInt();
			X=demo.nextInt();
			Y=demo.nextInt();
			
        	p=find(X);
	        q=find(Y);
	        
			if(Z==2) {
				if(p==q) {
					System.out.println('Y');
					continue;
				}
				System.out.println('N');
			}else {
				union(p,q);
			}		
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值