#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
//查并集
// 1.逻辑结构为集合
// 2.基本操作:初始化为-1,找到集合的根元素,将两个集合合并
// 3.储存顺序:顺序存储
// 4.优化:用根节点小的数合并到大树下
//初始化
int UFsets[100];
void Initial(int S[])
{
for(int i =0;i<100;i++)S[i] = -1;
}
//查找根节点
int find(int S[],int x)
{
while(x>=0)
{
x = S[x];
}
return x;
}
//合并集合
void Union(int S[],int a,int b)
{
if(a==b)return;
if(S[a]<S[b])//左边更大
{
S[a] +=S[b];//更新值
S[b] = a;
}
else
{
S[b] +=S[a];
S[a] = b;
}
}
//find 优化
int find(int S[],int x)
{
int root = x;
while(S[root]>=0)root = S[root];//找到根
while(x!=root)
{
int t = S[x];//存父节点
S[x] = root;//放在根节点下面
x = t;//换位
}
return root;
}
//核心思想:让树的高度越矮小