#include <iostream>
using namespace std;
const int maxn = 30010;
int father[maxn]; //父亲数组
int son[maxn]; //包括第i个结点在内的其子树结点的个数
int dis[maxn]; //表示第i个结点到根节点的距离
//初始化N个元素
void init()
{
for (int i = 1; i < maxn; i++)
{
father[i] = i;
son[i] = 1;
dis[i] = 0;
}
}
//查找树的根
int find(int x)
{
if (father[x] == x)
{
return x;
}
else //路径压缩
{
int tf = father[x];
father[x] = find(father[x]);
dis[x] += dis[tf];
return father[x];
}
}
//合并x和y所属的集合
void unite(int x, int y) //将x的堆放在y的堆上面
{
int faX = find(x);
int faY = find(y);
father[faY] = faX;
dis[faY] = son[faX];
son[faX] += son[faY];
}
//判断x和y是否属于同一个集合
bool same(int x, int y)
{
return find(x) == find(y);
}
int main()
{
int P;
while (scanf("%d", &P) == 1)
{
init();
for (int i = 1; i <= P; i++)
{
char ope[3];
scanf("%s", ope);
if (ope[0] == 'M')
{
int x, y;
cin >> x >> y;
unite(x, y);
}
else if (ope[0] == 'C')
{
int a;
cin >> a;
cout << son[find(a)] - dis[a] -1 << endl;
}
}
}
return 0;
}
参考:参考
还是挺迷的。。再多做做题吧。。