并查集的理解

1.并查集的创建:
int fa[200001]; void init(int n) { for (int i = 1; i <= n; i++) { fa[i] = i; } } 一开始未合并和分配祖先时,以自己为祖先
2.查找祖先(未进行路径压缩法):
//查找祖先 int find(int n) { if (fa[n] == n) return n; else return find(fa[n]); } 这个可以通过递归来逐渐找到自己的祖先例如:假设:1的祖先是2,2的祖先是3,3的祖先是它自己,这样便可通过先传入1得到2,在递归传2,找到3即可
2.查找祖先(路径压缩法):

//查找祖先方法2
int find(int n)
{
	if (fa[n] == n)
		return n;
	else
	{
		fa[n] = find(fa[n]);
		return fa[n];
	}
}`
//这个记忆法是如何是实现的呢:还是上面的例子:1的祖先是2,会调用find(fa[1])即找2的祖先,找到3,3的祖先是自己,返回3,同时把fa[2]=3赋值了,然后再返回3,此时,fa[1]=3了
这样可以直接返回到自己的最终祖先!
3.合并
`//进行合并
void union1(int a, int b)
{
	//找到a的祖先
	int fa_a = find(a);
	//找到b的祖先
	int fa_b = find(b);
	if (find(a) == find(b))
		return;
	else
	{
		if (fa_a < fa_b)
		{
			fa[fa_b] = fa_a;
		}
		else
			fa[fa_a] = fa_b;
	}
}`
这个代码的作用呢:就是找到a,b的祖先,然后把其中一个小的祖先作为二者的公共祖先即可!
例题:洛谷:P3367
参考视频:https://www.bilibili.com/video/BV1jv411a7LK/?spm_id_from=333.337.search-card.all.click&vd_source=b94c6cf1c27b4bba3af6553f696f7abf
posted @   xxw666  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示