#include<iostream>
#include<stdio.h>
int parent[30001];//保存此节点的父节点(不是根节点)
int height[30001];//保存该节点说在集合的根节点之下的节点数目(最上面的节点)
int under[30001];//保存该节点之下的节点数目(最下面的节点)
int FindParent(int x,int &hx)
{
int xParent;
if(parent[x]) {
xParent = FindParent(parent[x],height[parent[x]]);
hx += height[parent[x]];
return parent[x] = xParent;
}
return x;
}
void MergeSet(int x,int y)
{
height[y] += under[x] + 1;
under[x] += under[y] + 1;
parent[y] = x;
}
int main()
{
int n;
int x, y, t1, t2,i;
char s[20];
scanf("%d/n",&n);
for(i = 0; i < n; i++) {
gets(s);
if(s[0] == 'M') {
sscanf(s,"M %d%d",&x,&y);
t1 = FindParent(x,height[x]);
t2 = FindParent(y,height[y]);
MergeSet(t1,t2);
}
else {
sscanf(s,"C %d",&x);
// 找出父节点的同时更新节点到父节点的距离
t1 = FindParent(x,height[x]);
//节点下的节点个数为 父节点下节点个数 - 该节点到父节点的距离
printf("%d/n",under[t1] - height[x]);
}
}
return 0;
}
进一步学习并查集