这是一道带权并查集的入门题目,权即是关系,这个题的权是该节点距离特征性元素的距离,以及以x为开始的集合的元素个数
如不了解带权并查集,建议先学习一下再做
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 30005
using namespace std;
int t,f[maxn],value[maxn],num[maxn];
inline int find(int k)
{
if(f[k]==k) return f[k];
int fa=find(f[k]);
value[k]+=value[f[k]];
return f[k]=fa;
}
int main()
{
for(int i=1;i<=maxn;i++) f[i]=i,num[i]=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
char c;
int x,y;
scanf("%s%d%d",&c,&x,&y);
int f1=find(x),f2=find(y);
if(c=='M')
{
f[f1]=f2;
value[f1]+=num[f2];
num[f2]+=num[f1];
}
else
{
if(f1!=f2) printf("-1\n");
else printf("%d\n",abs(value[x]-value[y])-1);
}
}
return 0;
}