并查集详解原文地址 :http://blog.csdn.net/niushuai666/article/details/6662911
作者:飘过的小牛
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232
按照博客思路:
先初始化记录掌门人的数组per,默认每个各大侠的掌门人是他自己。然后对于每出现的两个大侠,通过向上每层上级的访问,找到他们的掌门人。
int unionsearch(int root)
{
int son, tmp;
son = root;
while(root != pre[root]) //寻找掌门ing……
root = pre[root];
/*while(son != root) //路径压缩
{
tmp = pre[son];
pre[son] = root;
son = tmp;
}*/
return root; //掌门驾到~
}
掌门人不同时,
if(root1 != root2) //掌门不同?踢馆!~
{
pre[root1] = root2;
total--; //门派少一个,敌人(要建的路)就少一个
}
掌门人相同时(即这两个点已经连通了),则不进行操作。若加上这条路径,则会形成环,这样会可能会导致查找掌门人时子函数中 while(root != pre[root]) 陷入死循环。