#include <cstdio>
#include <cstring>
using namespace std;
const int M = 1e5 +20;
int Rank[M*2], sum[M*2], p[M*2];
int find(int x){
if(x == p[x]) return x;
return p[x] = find(p[x]);
}
int main()
{
int x, y, fx, fy, q, m, n;
while(scanf("%d%d",&n,&m) != EOF){
for(int i = 0; i <= n; i++)
p[i] = i+M, p[i+M] = i+M, Rank[M+i] = 1, sum[M+i] = i;
while(m--){
scanf("%d",&q);
if(q == 1){
scanf("%d%d",&x, &y);
fx = find(x), fy = find(y);
if(fx != fy){
p[fx] = fy;
Rank[fy] += Rank[fx], Rank[fx] = 0;
sum[fy] += sum[fx], sum[fx] = 0;
}
}
else if(q == 2){
scanf("%d%d",&x, &y);
fx = find(x), fy = find(y);
if(fx != fy){
p[x] = fy;
Rank[fx]--, sum[fx] -= x;
Rank[fy]++, sum[fy] += x;
}
}
else {
scanf("%d",&x);
fx = find(x);
printf("%d %d\n",Rank[fx], sum[fx]);
}
}
}
return 0;
}//只要删除时保证是叶子节点就可以,建立虚拟跟节点,就能保证是叶子
UVA 11987 Almost Union-Find 虚拟跟节点的并查集
最新推荐文章于 2023-11-23 21:35:04 发布