不相交集合

一些应用将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.csdn.net/zhutulang/article/details/7791804

算法导论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值