这个题目,是我感觉之前写的一些东西还是理解不透彻,于是在写这个题目的时候,感觉理解上有更近了一层,这个题目坑的是,你必须把0这个情况也初始化,如果从1就报错,不知道为啥。
代码:
#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std ;
#define MAX 30005
int pre[MAX];
int sumBlocks[MAX];
int under[MAX];
void init()
{
for(int i = 0 ; i <MAX ; i ++)
{
pre[i]=i;
sumBlocks[i]=1;
under[i]=0 ;
}
}
int Find(int x)
{
if(x!=pre[x])
{
int t = pre[x];
pre[x]=Find(pre[x]);
under[x]+=under[t];
}
return pre[x];
}
void Merge(int a, int b )
{
int fa =Find(a);
int fb =Find(b);
if(fa!=fb)
{
pre[fa] = fb ;
under[fa]+=sumBlocks[fb];
sumBlocks[fb]+=sumBlocks[fa];
// sumBlocks[fa]= 0 ;
}
}
int main(){
int sum ,a,b;
string req ;
while(scanf("%d",&sum)!=EOF)
{
init();
while(sum--)
{
cin>>req;
if(req[0]=='M')
{
scanf("%d%d",&a,&b);
Merge(a,b);
}
else {
scanf("%d",&a);
Find(a);
printf("%d\n",under[a]);
}
}
}
return 0;
}