发现自己写了两道题都把Find函数写得一塌糊涂。。。一题是没有路径压缩过不了,一题是因为前面写错过弄混了,不三不四的。。。总结很重要啊!!
路径压缩:递归写法:
int Find (int x)
{
if(Father[x] != x)
{
Father[x] = Find(Father[x]);//原来写成Father[x] = Father[Father[x]]了。。 //不断地找到其根节点并更改其值
}
return Father[x];
}
非递归写法:
int Find(int x)
{
if(Father[x] != x)
{
Father[x] = Father[Father[x]];// 将p节点的父节点设置为它的爷爷节点 ,而自己设置为它的父节点 x = Father[x];
}
return x;
}
一般写法:
非递归递归:
int Find (int x)
{
// 寻找p节点所在组的根节点,根节点具有性质Father[root] = root
if(Father[x] != x)
{
x = Father[x] ;//把它的父节点的值找到赋给它,直到Father[root] = root
}
return x;//
}
递归写法:
int Find(int x)
{
if(a[x]!= x)//符合Father[x] = x的,x就是根节点,不是的就找到根节点返回。
{
return Find(a[x]);
}
return x;
}
总结:所谓的路径压缩,就是把根节点下面的所有子孙直接与根节点相连,这样搜索时搜索深度为1,而一般的写法只是把当前结点与它的父节点直接相连,那么搜索深度就>1了,时间就长了。要知道是不是路径压缩(有时我会弄混),只要看是不是把它的父节点设置为它的爷爷结点就行了。只针对个人总结。