题目链接:http://poj.org/problem?id=1988
思路:lnc记录该节点到其父节点的距离,sum记录这一堆的个数,lnc在更新父节点是需要更新,注意在查询时需要做一次更新。
#include<cstdio>
#include<cstring>
using namespace std;
const int N=30005;
int fa[N],lnc[N],p,sum[N];
void init()
{
int i;
for(i=0;i<N;i++)
{
fa[i]=i;
lnc[i]=1;
sum[i]=1;
}
}
int find(int a)
{
int ta=fa[a];
if(fa[a]!=a)
{
fa[a]=find(fa[a]);
lnc[a]=lnc[a]+lnc[ta]-1;
}
return fa[a];
}
int main()
{
int i,a,b,ra,rb;
char s[2];
//freopen("in.txt","r",stdin);
init();
scanf("%d",&p);
while(p--)
{
scanf("%s",s);
if(s[0]=='M')
{
scanf("%d%d",&a,&b);
ra=find(a);
rb=find(b);
if(ra==rb)
continue;
fa[ra]=rb;
lnc[ra]+=sum[rb];
sum[rb]+=sum[ra];
}
else if(s[0]=='C')
{
scanf("%d",&a);
find(a);
printf("%d\n",lnc[a]-1);
}
}
return 0;
}