一些应用将n个不同的元素分成一组不相交的集合。这些应用经常进行两种特别的操作:寻找包含给定元素的唯一集合和合并两个集合。这正是下面要实现的find_set函数与union_set函数。
一种常见的思路是把n个元素看做成n个树,树上的元素具有相同的父节点。每次find操作返回元素i的根节点,每次union操作(union_set(x,y))将x置成y的孩子,或是将y置成x的孩子。
实现:
数组p[]用于保存节点的双亲。
初始化:
有n个节点,1,2,3....n
int p[100];
int n;
memset(p,-1,sizeof(int)*100);
for(int j=1;j<=n;j++)
p[j]=j;
int find_set(int n)//找树的根节点
{
return p[n]==n?n:p[n]=find_set(p[n]);
}
合并操作:
void union_set(int x,int y)
{
int fx,fy;
fx=find_set(x);
fy=find_set(y);
if(fx==fy)
return ;
else
{
if(p[fx]>p[fy])
p[fx]=fy;
else
p[fy]=fx;
}
}
if(find_set(xi)==find_set(yi))
则xi 与 yi是 属于同一连通域
else
xi与yi属于不同的连通域
参考:http://blog.youkuaiyun.com/zhutulang/article/details/7791804
算法导论