参考了网上某些大神的思路,之后自己独立写了出来。
首先要把题读懂,这是关键。
计算的是x下面的箱子的数量,用up,down数组分别表示x上面盒子的数量和下面盒子的数量。利于此题的解答。
附上代码:
#include<stdio.h>
const int N=30000+10;
int a[N],up[N],down[N];
int n,m;
void makeset()
{
int i;
for(i=0;i<N;i++)
{
a[i]=i;
up[i]=0;
down[i]=1;
}
}
int find1(int n)
{
int t;
t=a[n];
if(t!=n)
{
a[n]=find1(t);
up[n]+=up[t];
}
return a[n];
}
void union1(int x,int y)
{
int px=find1(x);
int py=find1(y);
if(px!=py)
{
a[py]=px;
up[py]=down[px];
down[px]+=down[py];
}
}
void count1(int x)
{
int root=find1(x);
printf("%d\n",down[root]-up[x]-1);
}
int main()
{
int i,j,k;
int a1,b1,c1;
while(scanf("%d",&n)==1)
{
getchar();
makeset();
while(n--)
{
char ch;
scanf("%c",&ch);
if(ch=='M')
{
scanf("%d%d",&a1,&b1);
union1(a1,b1);
}
else if(ch=='C')
{
scanf("%d",&c1);
count1(c1);
}
getchar();
}
}
return 0;
}