
void init(int x)
{
	for(int i=0;i<=x;i++)
	{
		par[i]=i;
		ran[i]=0;
	}
}int find(int x)
{
	if(par[x]==x)
		return x;
	else
		return par[x]=find(par[x]);
}void unite(int x,int y)
{
	int xx = find(x);
	int yy = find(y);
	if(xx==yy)//先找出父节点 如果相同就返回;
		return ;
	if(ran[x]>ran[y])//如果不相同就把矮的树加到高的树上,如果相同就直接把一颗加到另一颗上;
		par[y]=x;
	else if(ran[y]>ran[x])
		par[x]=y;
	else
	{
		par[y]=x;
		ran[x]++;
	}
}原文地址:http://blog.csdn.net/u010123208/article/details/27568983