并查集:
是一种可以动态维护若干个不重叠的集合,并且支持合并和查询的数据结构。

主要包含如下两个基本操作:
- find,查询一个元素属于哪一个集合。
- merge,讲两个集合合并成一个集合
我们采用”代表元“法,即为每个集合选择一个固定的元素,作为整个集合的"代表"
其次,我们需要定义归属关系的表示方法,用一种树形结构存储每个集合,树上的每个结点都是一个元素,树根是集合的代表元素。
f[x]保存x的父节点,特别地,树根的父节点村存自己。
所以在初始化时,我们将所有点都初始化为”自己的父节点"
void init()
{
for (int i = 0; i < N; i++)
f[i] = i;
}
在查找元素的归属时,需要从该元素开始通过f[x]不断递归访问父节点,直至到达树根,为了提高查询效率,引入了路径压缩与按秩合并两种思想。
int find(int x)
{
if (x != f[x])f[x] = find(f[x]);
return f[x];
}
所以在合并集合时,只需要令一个树根为另一个树根的子节点

本文介绍了如何使用并查集数据结构解决一个双人游戏的结束判断问题。游戏中,两人在n×n的网格上交替画线,目标是形成封闭的圈。通过并查集的find和merge操作,可以高效地判断在第几步时游戏结束。当发现有线条连接到同一个集合时,游戏结束。程序实现了这一逻辑,并给出了输入输出示例。
最低0.47元/天 解锁文章
723

被折叠的 条评论
为什么被折叠?



