UVA11987 带删除的并查集
2016-09-30 17:15
211 查看
第一次做这种并查集…
删除这个动作实在是不好想…
只要坐标超过最大给他个新内存就可以了
原来的地方给他留着用来存以前的集合最大值…
但是位置改到新坐标去
然后属性复制过去就可以了
删除这个动作实在是不好想…
只要坐标超过最大给他个新内存就可以了
原来的地方给他留着用来存以前的集合最大值…
但是位置改到新坐标去
然后属性复制过去就可以了
#include<iostream> #include<algorithm> #include<memory.h> #include<cstdio> using namespace std; int n, m; struct p { int baba, zhi, geshu,weizhi; }; p gesh[200001]; int zhao(int q) { while (q != gesh[q].baba)q = gesh[q].baba; return q; } void hebing(int q, int w) { int qw = zhao(q); int wq = zhao(w); gesh[qw].baba = wq; gesh[wq].zhi += gesh[qw].zhi; gesh[wq].geshu += gesh[qw].geshu; } int main() { while (cin >> n >> m) { int gaga = 0; memset(gesh, 0, sizeof(gesh)); for (int a = 1;a <= n;a++)gesh[a] = { a,a,1,a}; while (m--) { int y; scanf("%d", &y); int s, d,sb,sd; if (y == 1) { scanf("%d%d", &s, &d); sb = zhao(gesh[s].weizhi); sd = zhao(gesh[d].weizhi); if (sb != sd)hebing(sb, sd); } else if (y == 2) { scanf("%d%d", &s, &d); sb = zhao(gesh[s].weizhi); sd = zhao(gesh[d].weizhi); gaga++; gesh[100000 + gaga].geshu = 1; gesh[100000 + gaga].zhi = s; gesh[s].weizhi = 100000 + gaga; gesh[100000+gaga].baba = 100000 + gaga; gesh[sb].zhi -= s; gesh[sb].geshu -= 1; hebing(100000 + gaga, sd); } else { scanf("%d", &s); d = zhao(gesh[s].weizhi); printf("%d %d\n", gesh[d].geshu, gesh[d].zhi); } } } return 0; }
相关文章推荐
- Uva11987 Almost Union-Find 并查集带删除
- uva11987 - Almost Union-Find 并查集删除元素
- 【uva11987】带删除的并查集
- 带权并查集--删除--UVA11987
- 并查集带删除操作uva11987(好)
- UVA11987:Almost Union-Find (并查集的删除)
- uva11987(加权并查集的删除操作)
- UVA11987_Almost Union-Find(并查集删除操作)
- hdu2473(并查集的删除)
- 11987 - Almost Union-Find(并查集删除操作)
- Junk-Mail Filter(并查集,删除结点,虚父节点)
- Almost Union-Find 并查集的删除
- 1022 合纵连横【并查集 元素的删除】
- HDU 5361 In Touch(并查集实现区间删除)
- hdu 2473 Junk-Mail Filter 并查集删除
- HDU2473 - Junk-Mail Filter 利用虚拟数组实现删除并查集的节点
- FZU - 2155 - 盟国 (带删除的并查集~~)
- hdu2473 Junk-Mail Filter 并查集的删除
- UVA - 11987 Almost Union-Find(带删除的并查集)
- 并查集的删除操作