【并查集】10.24

P2267 并查集

大佬的题解用比喻用得实在是太通俗易懂了……

#include<stdio.h>
int f[10005];
int find(int t)//找t的老大
{
	if(f[t]==t) return t;
	//如果t的老大就是他自己,那么已经找到了顶头老大,返回
	return f[t]=find(f[t]);
	//如果t的上头还有老大,那么签订契约确认t的老大就是t的老大
	//然后继续找t的老大的老大,一边找一边签订契约
}
int main()
{
	int n,m,k,x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&k,&x,&y);
		if(k==1) f[find(x)]=find(y);
		//合并x与y,不妨看作是x的老大认y的老大作老大
		//从而,以x的老大为首的小弟都并入了y的组织
		if(k==2){
			if(find(x)==find(y)) printf("Y\n");
			else printf("N\n");
		}
	}
	return 0;
 } 
发布了28 篇原创文章 · 获赞 0 · 访问量 680

猜你喜欢

转载自blog.csdn.net/weixin_45561591/article/details/102729139