以前求并查集都不太在乎每个数的根节点,其实并查集最好的就是这个作用。只需要改进一点就行
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
if(fx>fy)
pre[fx]=fy;
else
pre[fy]=fx;
}
}
用那个很通俗的讲法来说,如果上级不一样,谁的上级大就跟谁。
还有另一种方法就是以前的,但加了一个数组来判断
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
}
}
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
a[find(i)]=1;
}
for(int i=1;i<n;i++)
if(a[i]) ans++;