# include <stdio.h>
# include <algorithm>
using namespace std;
int father[10010];
int cot[10010];
int num[10010];
int find(int x)<span style="font-family: Arial, Helvetica, sans-serif;">//路径压缩 //</span>
{
if(x==father[x])
return x;
else
{
int p=father[x];
father[x]=find(father[x]);//上一个父亲节点
cot[x]+=cot[p];
}
return father[x];
}
void Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
cot[fx]++;//父亲节点++
father[fx]=fy;
num[fy]+=num[fx];
}
}
int main()
{
int t,i,n,m,a,b,c;
char s[5];
int cas=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("Case %d:\n",cas++);
for(i=1;i<=n;i++)//初始化
{
father[i]=i;
num[i]=1;
cot[i]=0;
}
for(i=0;i<m;i++)
{
scanf("%s",s);
if(s[0]=='T')
{
scanf("%d%d",&a,&b);
Union(a,b);
}
else
{
scanf("%d",&c);
printf("%d %d %d\n",find(c),num[find(c)],cot[c]+cot[find(c)]);//子结点自己移动的次数加上根结点移动的次数,就是这个结点总共的移动次数
}
}
}
return 0;
}
hdu 3635 Dragon Balls ( 并查集路径压缩)
最新推荐文章于 2021-10-25 19:11:05 发布