UVA 11987 Almost Union-Find (并查集,可持久化)
2013-12-04 12:29
357 查看
大白书:p246
UVA 11987Almost Union-Find
加一个id[],不修改,而是insert,然后改id
UVA 11987Almost Union-Find
加一个id[],不修改,而是insert,然后改id
const int MAXN = 100010 * 2; const int MOD = 1000000; int fa[MAXN], num[MAXN]; int sum[MAXN]; int idx[MAXN]; void init(int n) { REP(i, n + 1) { idx[i] = i; fa[i] = i; num[i] = 1; sum[i] = i; } } int find(int x) { if (x != fa[x]) fa[x] = find(fa[x]); return fa[x]; } int main() { int n, m; int x, y; while (cin >> n >> m) { init(n); int k = n + 1;///!!!!!! while (m--) { RI(x); if (x == 1) { RII(x, y); int xx = idx[x]; int yy = idx[y]; int fax = find(xx); int fay = find(yy); if (fax != fay) { fa[fax] = fay; num[fay] += num[fax]; sum[fay] += sum[fax]; } } else if (x == 2) { RII(x, y); int xx = idx[x]; int yy = idx[y]; int fax = find(xx); int fay = find(yy); if (fax != fay) { num[fax]--; sum[fax] -= x; num[fay]++; sum[fay] += x; idx[x] = k; num[k] = 1; sum[k] = x; fa[k] = fay; k++; } } else { RI(x); int xx = idx[x]; int fax = find(xx); printf("%d %d\n",num[fax], sum[fax]); } } // FE(i, 1, n) // { // int fax = find(idx[i]); // cout << i << "" << idx[i] << " " << fax << "" << num[fax] << " " << sum[fax] <<endl; // } } }
相关文章推荐
- 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(并查集)
- 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 并查集的删除操作 懒惰标记
- UVA11987 - Almost Union-Find (并查集带删除)
- UVa 11987 并查集 Almost Union-Find
- UVA 11987 - Almost Union-Find 并查集的活用 id化查找
- uva 11987 Almost Union-Find(带删除操作的并查集)