题目链接点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=3635
#include<cstdio>
#include<cstring>
const int MAXN=10010;
int fath[MAXN],num[MAXN],move[MAXN];
int N,Q ;
void init()
{
for(int i=1;i<=N;i++)
{
fath[i]=i;
num[i]=1;
move[i]=0;
}
}
int find(int x)
{
if(x==fath[x])
return x;
int t=fath[x];
fath[x]=find(fath[x]);
move[x]+=move[t];//东西上交给父亲,至于自己付出多少辛苦得来的自己记着就行,别人都不在乎!
return fath[x];
}
void merge(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
fath[a]=b;
num[b]+=num[a];//可以理解为a认b作为干爹,所以你要上交你的财务
move[a]=1;
}
}
int main()
{
int T,cnt=1;
char s[2];
int x,y,z;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&N,&Q);
printf("Case %d:\n",cnt++);
init();
for(int i=0;i<Q;i++)
{
scanf("%s",s);
if(s[0]=='T')
{
scanf("%d %d",&x,&y);
merge(x,y);
}
else
{
scanf("%d",&z);
int fz=find(z);
printf("%d %d %d\n",fz,num[fz],move[z]);//父亲结点,这个结点的球的个数, 球移动的距离
}
}
}
return 0;
}