#include<stdlib.h>
#include<stdio.h>
#define N 300100
int pre[N],sum[N],under[N];
void init(int n)
{
for(int i=1;i<=n;i++)
{
sum[i]=1;
pre[i]=i;
under[i]=0;
}
}
int find(int x )
{
if(pre[x]==x)
return x;
int tem=pre[x];
pre[x]=find(pre[x]);
under[x]+=under[tem];
//sum[x]=sum[pre[x]];
return pre[x];
}
int myunion(int fu,int fv,int u,int v)
{
pre[fu]=fv;//把下面的当成根 ,因为在find函数中,
//路径压缩的时候才能把下面的个数正确加到上面去
under[fu]+=sum[fv];
sum[fv]+=sum[fu];
}
int main()
{
int i,n,fu,fv,u,v;
char op;
while(scanf("%d",&n)!=EOF)
{
init(n);
for(i=1;i<=n;i++)
{
scanf("%s",&op);
if(op=='M')
{
scanf("%d%d",&u,&v);
fu=find(u);
fv=find(v);
if(fu!=fv)
{
myunion(fu,fv,u,v);
}
}
else
{
scanf("%d",&u);
find(u);
printf("%d\n",under[u]);
}
}
}
return 0;
}
/*
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
8
M 1 6
C 1
M 2 4
M 2 6
M 3 1
C 3
C 4
C 2
1 4 2 3
*/
hdu2818(帶权并查集 待过)?
最新推荐文章于 2020-12-08 19:28:25 发布