#include <iostream>
#include <cstdio>
using namespace std;
static const int MAX = 31000;
static int par[MAX];
static int sum[MAX];//砖块i所在堆的砖块数目
static int under[MAX];//表示i下面有多少个砖块
static int GetParent(int a)
{
if (par[a]==a)
return a;
int t = GetParent(par[a]);
under[a] +=under[par[a]];//路径压缩后更新
par[a] = t;
return par[a];
}
static void Merge(int a,int b)
{
int n;
int pa = GetParent(a);
int pb = GetParent(b);
if (pa==pb)
return;
par[pb] = pa;
under[pb] = sum[pa];
//under[pb] 赋值前一定是0,因为parent[pb] = pb,pb一定是原b所在堆最底下的
sum[pa] +=sum[pb];//根引出来的有多少个结点
}
int main()
{
int p;
for (int i=0;i<MAX;++i)
{
sum[i] = 1;
under[i] = 0;
par[i] = i;
}
scanf("%d",&p);
for (int i=0;i<p;++i)
{
char s[20];int a,b;
scanf("%s",s);
if (s[0]=='M')
{
scanf("%d%d",&a,&b);
Merge(b,a);
}
else
{
scanf("%d",&a);
GetParent(a);
printf("%d\n",under[a]);
}
}
return 0;
}
POJ1988基本的并查集
最新推荐文章于 2022-03-03 13:43:07 发布