foj2155 - 盟国 (并查集的删除操作)
来源:互联网 发布:淘宝直播账号出售 编辑:程序博客网 时间:2024/05/16 15:41
题目链接
思路
并查集的删除节点,基本的并查集只涉及合并和查询,没有删除。
并查集的结构是树形的,在删除一个节点的同时还要保持其子节点与根节点的相对关系,是很麻烦的,所以我们的做法就是不去删除,而是重新为它开辟空间来进行存储。
也就是再开一个info数组,来保存各个节点的关系的存储位置,在用一个par数组来维护节点之间的关系,由于大量的删除,所以info数组要远大于par数组。
对于整个代码来说,并查集的操作并不需要变化,只需要添加一个del函数。例如查询 i 的根节点时,需要调用info[i]。
代码
#include <cstring>#include <cstdio>#include <set>using namespace std;const int maxn = 100000;int info[maxn+10];int par[maxn*10];bool vis[maxn*10];int nCount;void init(int n){ for(int i=0; i<n; i++) { par[i] = info[i] = i; } nCount = n;}int get_par(int a){ if(par[a]==a) return a; else return par[a] = get_par(par[a]);}void merge(int a, int b){ int pa = get_par(a); int pb = get_par(b); if(pa!=pb) par[pb] = pa;}// 删除节点void del(int a){ // 额外分配空间 info[a] = nCount; par[nCount] = nCount; nCount++;}int main(){ int n, m, tt=1; int a, b; char op[5]; while(scanf("%d%d", &n, &m)&&n) { init(n); for(int i=0; i<m; i++) { scanf("%s%d", op, &a); if(op[0]=='M') { scanf("%d", &b); merge(info[a], info[b]); } else { del(a); } } memset(vis, false, sizeof(vis)); int re = 0; for(int i=0; i<n; i++) { int temp = get_par(info[i]); if(!vis[temp]) { vis[temp] = true; re++; } } printf("Case #%d: %d\n", tt++, re); } return 0;}
0 0
- foj2155 - 盟国 (并查集的删除操作)
- FZU - 2155 - 盟国 (带删除的并查集~~)
- FZU 2155 盟国(并查集的删除)
- FZU2155 盟国 (并查集的虚拟节点)
- FZOJ 2155 盟国 (并查集,删除结点)
- 【带删除并查集】FZU 2155——盟国
- fzu 2155 盟国 并查集的增删
- fzu 2155 盟国 并查集的增删
- Fzu 2155 盟国【并查集的增删】裸题
- HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)
- NYOJ-1022合纵连横(并查集的删除操作)
- NYOJ1022合纵连横(支持删除操作的并查集)
- uva11987(加权并查集的删除操作)
- UVA 11987 Almost Union-Find (带权并查集的操作及并查集的删除操作)
- UVA11987(带权并查集的删除操作)
- 并查集中的合并、删除操作
- *hdu2473 (并查集的删除)
- hdu2473(并查集的删除)
- SQL中的CASE使用方法
- CSS设置DIV居中
- jquery简单动画效果(上)
- printf输出各种格式(转)
- Android学习历程之【安装】
- foj2155 - 盟国 (并查集的删除操作)
- [223]Rectangle Area
- 讨论
- 测试二知识总结
- HDU2642 Stars 二维树状数组
- php UNSIGNED ZEROFILL
- 手游创业漫话五 (我要做什么游戏 下)
- Win7平台VS2010安装Visual Assist X
- 避免带有变长参数的方法重载,别让null值和空值威胁到变长方法,覆写变长方法也循规蹈矩