【UVA 11987】并查集
2017-02-14 23:15
190 查看
题目链接:
UVA-11987题解:
就是简单的并查集,只不过包括了转移一个元素,而不是整个集合。方法很简单:
[b]法一:[/b]
将对每一个元素,将他们的祖先设置成一个不存在的结点,这样就可以自由的操作了,并对每个集合直接进行修改。
[b]法二:[/b]
(某whx同学教我的) 无需删除被移除的元素,只要将它标记一下,再在将要被移到的那个集合里加上那个元素即可。
下面我给出法一的代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 400010 int f ,size ; long long sum ; int n,m,opt; int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); } int main() { int p,q; while(scanf("%d%d",&n,&m) != EOF) { for(int i = 1;i <= n;i++) {f[i] = i+n;f[i+n] = i+n;size[i+n] = 1; sum[i+n] = i; } while(m--) { scanf("%d",&opt); if(opt == 1) { scanf("%d%d",&p,&q); int fa = find(p),fb = find(q); if(fa != fb) { f[fb] = fa; size[fa] += size[fb]; sum[fa] += sum[fb]; } } if(opt == 2) { scanf("%d%d",&p,&q); int fa = find(p),fb = find(q); if(fa != fb) { f[p] = fb; size[fb] ++; sum[fb] += p; size[fa] --; sum[fa] -= p; } } if(opt == 3) { scanf("%d",&p); int fa = find(p); printf("%d %lld\n",size[fa],sum[fa]); } } } return 0; }
相关文章推荐
- uva 11987 Almost Union-Find(并查集)
- UVA 11987 Almost Union-Find [并查集]
- Almost Union-Find(Uva 11987)并查集
- uva11987 并查集小技巧
- uva 11987 几乎就是并查集(并查集+一点小技巧)
- UVA11987(带权并查集的删除操作)
- UVA 11987 Almost Union-Find(hash + 并查集)
- uva 11987 带删除的并查集
- UVA - 11987 Almost Union-Find (并查集的节点删除)
- uva 11987 - Almost Union-Find(并查集)
- UVa 11987,Almost Union-Find,并查集
- UVA 11987 Almost Union-Find (带权并查集的操作及并查集的删除操作)
- UVA 11987 Almost Union-Find(并查集)
- UVA 11987 Almost Union-Find 并查集节点删除
- UVA11987--Almost Union-Find--带权并查集
- UVA 11987 - Almost Union-Find 并查集的活用 id化查找
- UVA - 11987 Almost Union-Find(带删除的并查集)
- UVa 11987 Almost Union-Find(支持删除操作的并查集)
- 初学并查集的例题2 UVA 11987 Almost Union-Find
- uva 11987 并查集