引子:用于数据统计与查找
1.理解:将各个元素分成多个集合并用每个集合的其中一个且唯一一个元素去表达它所在的集合。
2.如何表达:我们用fa[]数组去表达一个集和。对于fa[x]=y,我们理解为x为一个任意数,y为x这个元素所在集合的表达元素。对于与x在相同集合的任意元素的fa[与x在相同集合的任意元素]=y。
注意:对于集合的表达元素有,它所在集合的表达元素就是自己即fa[y]=y
3 上代码
int find(int x,)//将x元素所在的集合代表元素
{
if(fa[x]==x)
return x;//代表元素是自己
return fa[x]=find[fa[x]];//继续找
}
----------------------------------------------------------------------------------
要注意的是初始时因为每个元素都是独立的,所以每个集合的代表元素就是自己。要赋值
for(int i=1;i<=n;i++)
fa[i]=i;
------------------------------------------------------------------------------------
如何合集合呢
void merge(int x,int y)//合并x元素所在的集合和y元素所在的集合
{
int u=find(x),v=find(y)//找到它们的代表元素
if(x==y)
return;//它们已经在同一个集合了,返回
fa[x]=y//将y设置为两个集合的代表元素
}
4.说一下写题心得
那题”食物链“是个好题目。。
一般我们会直接设三个集合去表达x,y,z三种动物,但这样很难判断它们之间的关系,所以我们将集合增多,变成6个。因为每个动物都有可能是n只,所以我们将范围扩大到n*3。输入 b动物和c动物,b+n所在的集合表示被b吃的动物,b+n*2所在的表示吃b的动物,这样每种动物就有三个集合,再将相同的合并就行。