题意:
一开始每个城市里有一个龙珠 每次T操作使得A龙珠所在城市的所有龙珠飞到B龙珠所在城市 Q操作询问X龙珠在哪个城市 那个城市里有几个龙珠 X飞过几次
思路:
从T操作的功能来看想到并查集 即 每次找到所在城市(找根)飞到另一个城市(并集)
但是并查集无法统计每个龙珠飞过几次 这时候我们可以给并查集加上一个权值
每次飞的时候使A集合的权值++ 这样当询问X飞过几次的时候 只需要从X开始找根 并把路径上的权值求和即可
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 11000
int num[N],mov[N],fa[N];
int T,t,n,m;
int getf(int x)
{
if(x!=fa[x])
{
int tmp=fa[x];
fa[x]=getf(fa[x]);
mov[x]+=mov[tmp];
}
return fa[x];
}
int main()
{
int i,x,y,fx,fy;
char op[10];
while(~scanf("%d",&T))
{
for(t=1;t<=T;t++)
{
printf("Case %d:\n",t);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
num[i]=1;
fa[i]=i;
mov[i]=0;
}
while(m--)
{
scanf("%s",op);
if(op[0]=='T')
{
scanf("%d%d",&x,&y);
fx=getf(x);
mov[fx]++;
fy=getf(y);
num[fy]+=num[fx];
num[fx]=0;
fa[fx]=fy;
}
else if(op[0]=='Q')
{
scanf("%d",&x);
fx=getf(x);
printf("%d %d %d\n",fx,num[fx],mov[x]);
}
}
}
}
return 0;
}