MergingSets
一般的并查集只有find,merge两种,写一个最简单的版本代码可以非常短,find包括递归 非递归,普通和压缩路径这么四种,据瞿神所说递归
版的效率不会差到哪儿去,merge又分平衡版和非平衡版的merge
初始用-1表示集合头,否则p[x]表示x的所在树形结构的父亲所在的index, -1表示是集合头
普通查找
int find(int x)
{
if(a[x]==-1)
return x;
else
return find(a[x]);
}
带压缩路径的查找
int find(int x)
{
if(a[x]==-1)
return x;
else
return a[x]=find(a[x]);//瞿神指出了错误
}
void merge(int x, int y)
{
int xi=find(x),yi=find(y);
if(xi!=yi) p[xi]=yi;//此处感谢卓连翔师弟提醒,一直都是有bug的,如果上课教的-1版本,那么merge一定要判下不是同一个集合再merge
}