①将两个集合合并
②询问两个元素是不是一个集合
基本原理:每个集合用一个树表示,树根的编号就是整个集合的编号。每个节点都存储他的父节点,p[x]代表x的父节点。
树根的p[x] = x;
如何求x的集合编号呢?
while(x != p[x])
{
x = p[x];
}
如何合并两个集合?
让一个集合的根的p[x] = 另外一个集合的编号
优化:将路径上的点全部指向根节点
int Find(int nNum)
{
if(nNum != Father[nNum])
{
Father[nNum] = Find(Father[nNum]);
}
return Father[nNum];
}