并查集的题,刚开始学,卡题卡的厉害...看题解过的。需要输出龙珠转移次数,可以每次更新当前根节点的次数。最后需要输出转移次数时,加上当前龙珠记录的次数加上其所有根节点的次数即为转移次数。理解的不是很透彻,略蛋疼。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define INF 1000000000
#define max_N 10005
int par[max_N+5];
int r[10005];
int p[10005];
void init(int n)
{
int i;
for(i=0; i<n; i++)
{
par[i]=i;
}
}
int find(int x)
{
if(par[x]==x)return x;
else return find(par[x]);
}
void uni(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return;
par[x]=y;
}
int jud(int x,int y)
{
return find(x)==find(y);
}
int main()
{
int t,n,m,x,y,i,num=1,sum;
char c[2];
scanf("%d",&t);
while(t--)
{
memset(r,0,sizeof(r));
printf("Case %d:\n",num++);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
p[i]=1;
init(n+1);
while(m--)
{
scanf("%s",c);
if(c[0]=='T')
{
scanf("%d%d",&x,&y);
r[find(x)]++;
p[find(y)]=p[find(y)]+p[find(x)];
uni(x,y);
}
else
{
sum=0;
scanf("%d",&x);i=x;
while(par[x]!=x)
{
sum=sum+r[x];
x=par[x];
}
printf("%d %d %d\n",find(i),p[find(i)],sum);
}
}
}
return 0;
}