题目链接:Cube Stacking(带权并查集)
- 递归
/* 带权并查集*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 30010
#define M 30000
//把根节点定为每个堆下方的点,f[x]是与x相连下方的点
int f[N];
int height[N];//每个节点下边的节点数
int size[N];//此节点所在堆的节点数
//通过递归查询到根值,确定在当前的栈内每个木块的高度
int find(int x){
if(f[x]!=x){
int t=f[x];
f[x]=find(t);// 递归查找根代表值
height[x]+=height[t]; //t为f[x]是x下方的点
}
return f[x];
}
//合并栈 确定上方栈的根值高度 更新新栈大小
void move(int a, int b){
int fa=find(a), fb=find(b);
if(fa!=fb){
f[fa]=fb;
height[fa]=size[fb];
size[fb]+=size[fa];
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<M;i++){
f[i]=i;
height[i]=0;
size[i]=1;
}
while(n--){
char ch[2];
int a,b;
scanf("%s%d",ch,&a);
if(*ch=='M'){
scanf("%d",&b);
move(a,b);
}
else{
find(a);
printf("%d\n",height[a]);
}
}
return 0;
}
初学建议模拟