优化的并查集虽在查询是会明显提高效率但在处理时有额外负担容易爆栈
!!!
int findset(int x)
{
int r=x;
while(pa[r]!=r)
r=pa[r];
int i=x,j;
while(i!=r)
{
j=pa[i];
pa[i]=r;
i=j;
}
return r;
}
void union1(int x,int y)
{
x=findset(x);
y=findset(y);
if(h[x]==h[y])
{
h[x]++;
pa[y]=x;
}
else {
if(h[x]<h[y])
pa[x]=y;
else pa[y]=x;
}
}