以hdu1213为例:题解
第一组数据:
N=5 M=3
1 2
2 3
4 5
数组初始值:
father[1]=1 father[2]=2 father[3]=3 father[4]=4 father[5]=5
第一行数据输入后:
father[1]=2 father[2]=2 father[3]=3 father[4]=4 father[5]=5
此时编号为1和2的人相关联,将faher[1]的值变为2
第二行数据输入后:
father[1]=1 father[2]=3 father[3]=3 father[4]=4 father[5]=5
此时编号为2和3的人相关联,将faher[2]的值变为3
第三行数据输入后同上,最后数组的值变为
father[1]=1 father[2]=3 father[3]=3 father[4]=5 father[5]=5
由题目中所给数据我们可以手动将5个人分成两组
第一组:1 2 3
第二组:4 5
再联系数组中的结果我们可以发现,第一组数组中的数值只有一个人的数组序号和其对应的数组的值相等,第二组亦然。
第二组数据:
N=5 M=1
2 5
数据输入后数组的结果
father[1]=1 father[2]=5 father[3]=3 father[4]=4 father[5]=5
第一组:1
第二组:2 5
第三组:3
第四组:4
结果同第一组数据
结论:由以上例子得出,数组中father[i]=i的i的数量即为集合数
Union(int x,int y)//将两个序号关联
{
x=Find(x);
y=Find(y);
father[x]=y;
}
Find(int x)//找到该集合中father[i]=i形式的元素进行关联,目的是维持每个集合中只
//有一个元素在数组中的形式是father[i]=i
{
if(x==father[x]) return x;
return Find(father[x]);
}