题意:
这里有N个龙珠,每个龙珠初始时都在本身的城市(第i个龙珠在第i个城市),然后要你回答对应的询问。
输入:首先是一个T(0< T <= 100),表示由T个实例。对于每个实例,第一行是N and Q (2 < N <= 10000 , 2 < Q <= 10000),表示接下来有Q个询问。然后对应每个询问是下面两个命令的一种:
T A B(1<= A, B <= N),表示将和A龙珠在同一个城市的所有龙珠都移到B龙珠所在的城市去。(保证A与B不在同一个城市)
Q A。你需要输出X,Y,Z。X是A龙珠目前所在的城市,Y是X城市所有的龙珠,Z是A龙珠被转移的次数。
输出:回答每条Q命令的X,Y,Z.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000+5;
int fa[maxn]; //父节点
int num[maxn]; //节点数
int dist[maxn]; //转移次数
int findset(int x)
{
if(fa[x]==-1) return x;
int root=findset(fa[x]);
dist[x] += dist[fa[x]];
return fa[x]=root;
}
int bind(int u,int v)//将u分量加入v分量下面
{
int fu=findset(u);
int fv=findset(v);
if(fu != fv)
{
num[fv] += num[fu];
dist[fu]++;
fa[fu]=fv;
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
for(int kase=1; kase<=T; ++kase)
{
printf("Case %d:\n",kase);
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
fa[i]=-1;
num[i]=1;
dist[i]=0;
}
char str[10];
while(q--)
{
scanf("%s",str);
if(str[0]=='T')
{
int u,v;
scanf("%d%d",&u,&v);
bind(u,v);
}
else if(str[0]=='Q')
{
int u;
scanf("%d",&u);
int root=findset(u);
printf("%d %d %d\n",root,num[root],dist[u]);
}
}
}
return 0;
}