UVa 11987 Almost Union-Find (加权并查集&删除结点的技巧)
2014-03-07 14:23
302 查看
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3138
如何删除?增加一个新结点,标号为所有结点(包括新结点)的最大编号+1
然后将旧结点的影响变为0,同时初始化新结点:
完整代码:
如何删除?增加一个新结点,标号为所有结点(包括新结点)的最大编号+1
然后将旧结点的影响变为0,同时初始化新结点:
void delet(int x) { int tx = find(id[x]); --num[tx], sum[tx] -= x; ///将旧结点的影响变为0 id[x] = ++cnt; fa[id[x]] = id[x], num[id[x]] = 1, sum[id[x]] = x; }
完整代码:
/*0.179s*/ #include<bits/stdc++.h> using namespace std; const int mx = 200005; int fa[mx], id[mx], num[mx], cnt; ///id[i]表示i的实际节点编号 long long sum[mx]; void init(int n) { for (int i = 1; i <= n; ++i) { id[i] = fa[i] = sum[i] = i; num[i] = 1; } cnt = n; } int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);} void merge(int x, int y) { x = find(id[x]), y = find(id[y]); fa[x] = y, num[y] += num[x], sum[y] += sum[x]; } void delet(int x) { int tx = find(id[x]); --num[tx], sum[tx] -= x;///将旧结点的影响变为0 id[x] = ++cnt;///建立新结点 fa[id[x]] = id[x], num[id[x]] = 1, sum[id[x]] = x;///初始化新结点 } int main() { int n, m, op, x, y; while (~scanf("%d%d", &n, &m)) { init(n); while (m--) { scanf("%d", &op); if (op == 1) { scanf("%d%d", &x, &y); if (find(id[x]) != find(id[y])) merge(x, y); } else if (op == 2) { scanf("%d%d", &x, &y); if (find(id[x]) != find(id[y])) delet(x), merge(x, y); } else { scanf("%d", &x); printf("%d %lld\n", num[find(id[x])], sum[find(id[x])]); } } } return 0; }
相关文章推荐
- 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
- 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(带删除操作的并查集)
- 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[并查集 删除]