并查集

for(int i=1;i<=n;i++){                       //初始化
	father[i]=i;
}

int Find(int x){                            //查找父节点 递归
	if(x!=father[x]){
		x=Find(father[x]);
	}
	return x;
}

int Find(int x){                            //递推
	while(x!=father[x]){
		x=father[x];
	}
	return x;
}

void Union(int a,int b){                   //合并
	int x=Find(a);
	int y=Find(b);
	if(x!=y){
		father[x]=y;
	}
	return ;
}

int Find(int x){                            //路径压缩   递推
	int a=x;
	while(x!=father[x]){
		x=father[x];
	}
	while(a!=father[a]){
		int z=a;
		a=father[a];
		father[z]=x;
	}
	return x;
}

int Find(int x){                           //递归
	if(x==father[x]){
		return x;
	}
	else{
		int F=Find(father[x]);
		father[x]=F;
		return F;
	}
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务