并查集的理解
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端