您的位置:首页 > 其它

uva 11987 删点并查集

2015-08-19 12:07 288 查看
题意:三种操作 1. 合并两个集合 2.把x放到y所在的集合 3.输出x所在集合的元素个数和元素的和

思路:删点并查集 相当与给每个元素套了一个壳。

#include <bits/stdc++.h>
using namespace std;
int fa[200010];
long long sum[200010];
int num[200010];
int idx[200010];
int getf(int a)
{
if(fa[a] != a)
fa[a] = getf(fa[a]);
return fa[a];
}
void merge(int a, int b)
{
int x = getf(a);
int y = getf(b);
if(x != y)
{
fa[y] = x;
sum[x] += sum[y];
num[x] += num[y];
}
}
int cnt;
void Delete(int x)
{
int f = getf(idx[x]);
num[f] --;
sum[f] -= x;
idx[x] = ++cnt;
num[idx[x]] = 1;
sum[idx[x]] = x;
fa[idx[x]] = cnt;
}
void init(int n)
{
for(int i=1; i<=n; i++)
fa[i] = sum[i] = idx[i] = i,num[i]=1;
}
int n,m;
int main()
{
while(cin>>n>>m)
{
init(n);
cnt = n;
int cmd,x,y;
while(m--)
{
scanf("%d", &cmd);
if(cmd == 1)
{
scanf("%d %d", &x, &y);
merge(idx[x], idx[y]);
}
else if(cmd == 2)
{
scanf("%d %d", &x, &y);
if(getf(idx[x]) != getf(idx[y]))
{
Delete(x);
merge(idx[y], idx[x]);
}
}
else
{
scanf("%d", &x);
int tt = getf(idx[x]);
printf("%d %lld\n", num[tt],sum[tt]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集