题目链接

题意:n个数(即1-n)和m个操作:

1表示把x和y合并,2表示把x移到y集合里面,3表示统计x集合的元素个数

1,3好说,关键是2操作,可以先把2删除掉,删除的操作可以找一个其他的数字来取代x,这样就有新生出来一个集合,移到y集合就合并

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100000;
typedef long long LL;
int father[N + N + 10];
int sum[N + N + 10],cnt[N + N + 10]; // sum求集合里面所有元素和,cnt表示个数
int value[N + N + 10]; //表示第i个数值
int n,m,k;
void init()
{
k = n + 1;
for(int i = 0; i <= n; i++)
{
father[i] = i;
sum[i] = i;
cnt[i] = 1;
value[i] = i;
}
}
int Find(int x)
{
if(x == father[x])
return x;
return father[x] = Find(father[x]);
}
void Union(int x, int y)
{
int fx = Find(x);
int fy = Find(y);
if(fx != fy)
{
father[fx] = fy;
sum[fy] += sum[fx];
cnt[fy] += cnt[fx];
}
}
void Remove(int x)
{
/*
int fx = Find(value[x]);
cnt[fx]--;
sum[fx] -= x;
value[x] = k;
int fy = Find(value[y]);
father[k] = fy;
cnt[fy]++;
sum[fy] += x;
k++;
*/
int fx = Find(value[x]);
cnt[fx]--; // 删除x时从父节点集合中减一
sum[fx] -= x; // sum中减去x
value[x] = k; // 用 k 来代替 x ,生成了一个单独的集合,父节点是k
cnt[k] = 1;
sum[k] = x;
father[k] = k;
k++;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
k = n + 1;
for(int i = 0; i <= n; i++)
{
father[i] = i;
sum[i] = i;
cnt[i] = 1;
value[i] = i;
}
int order,p,q;
while(m--)
{
scanf("%d", &order);
if(order == 1)
{
scanf("%d%d", &p, &q);
Union(value[p], value[q]);
}
else if(order == 2)
{
scanf("%d%d", &p, &q);
int fx = Find(value[p]);
int fy = Find(value[q]);
if(fx != fy) // 如果p和q本来就在一个集合,就不用操作了。但是少了这个就wa了,不明白为什么操作不行
{
Remove(p);
Union(value[p], value[q]);
}
}
else if(order == 3)
{
scanf("%d", &p);
int fx = Find(value[p]);
printf("%d %d\n", cnt[fx], sum[fx]);
}
}
}
return 0;
}

  

UVA11987Almost Union-Find(并查集删除节点)的更多相关文章

  1. hdu2473 Junk-Mail Filter 并查集+删除节点+路径压缩

    Description Recognizing junk mails is a tough task. The method used here consists of two steps:  1) ...

  2. 洛谷UVA11987Almost Union-Find题解--并查集的删除

    题目链接 https://www.luogu.org/problemnew/show/UVA11987 分析 分析下操作发现就是加了个删除操作的并查集,怎么做删除操作呢. 我们用一个\(id[]\)记 ...

  3. Hdu 2473(并查集删除操作) Junk-Mail Filter

    有木有非常吊 加强 加强版   啊  ,看了都不敢做了   .后来先做了食物链这个我还是看过的.但还是A不掉,没明确神魔意思 .总而言之.大牛的博客是个好东西.我就那么看了一下,还是不懂怎莫办啊,哎, ...

  4. HDU 2473 Junk-Mail Filter 【并查集删除】

    Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 并查集(删除) UVA 11987 Almost Union-Find

    题目传送门 题意:训练指南P246 分析:主要是第二种操作难办,并查集如何支持删除操作?很巧妙的方法:将并查集树上p的影响消除,即在祖先上(sz--, sum -= p),然后为p换上马甲:id[p] ...

  6. HDU 5441 Travel(并查集+统计节点个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...

  7. HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)

    http://acm.hdu.edu.cn/showproblem.php?pid=2473 http://acm.fzu.edu.cn/problem.php?pid=2155 题目大意: 编号0~ ...

  8. HDU2473 Junk-Mail Filter - 并查集删除操作(虚父节点)

    传送门 题意: 每次合并两份邮件,或者将某一份邮件独立出来,问最后有多少个邮件集合. 分析: 考虑初始化每个节点的祖先为一个虚父节点(i + n),虚父节点指向它自己.这样可以进行正常的合并操作. 而 ...

  9. UVA - 11987 Almost Union-Find[并查集 删除]

    UVA - 11987 Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, y ...

随机推荐

  1. JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  2. Python3.5 + django1.8.5 安装”import pymysql pymysql.install_as_MySQLdb()”的解决方法

    最近在学习Python,打算先看两个在线教程,再在github上找几个开源的项目练习一下,在学到"被解放的姜戈"时遇到django同步数据库时无法执行的错误,记录一下. 错误现象: ...

  3. 转一篇关于如何在Unity里使用Protobuf

    原帖地址: http://purdyjotut.blogspot.com/2013/10/using-protobuf-in-unity3d.html 先转过来,等时间合适了,再来收拾 Using P ...

  4. [HDOJ5442]Favorite Donut(最大表示法)

    嗯……就是最小表示法改一下…… 这题就是把S串当作两个判断同构的串,然后就搞出最大的表示了 然后在反向再做一次 O(n)求最大表示,O(n)判断正反谁大

  5. Css-自适应高度修复(高度随内容而自动撑高)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. 60-chmod 修改文件的权限

    修改文件的权限 chmod [options] who operator permission file-list (符号模式) chmod [options] mode file-list (绝对模 ...

  7. android listview 的监听事件

    今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了, 闲言少叙,说说我遇到的问题吧: 上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一 ...

  8. eclipse下package的命名规范

    Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...

  9. 安装myeclipse10后破解时发现没有common文件夹

    今天重新安装了myeclipse10软件,然后在破解的时候发现安装目录下没有common,这是因为以前安装过myeclipse,卸载时没有完全清除,再次安装时,myeclipse会自动找到以前安装的c ...

  10. PHP中生成json信息的方法

    <?php //php中生成json信息 //json_encode(数组/对象) $color = array('red','blue','green'); //[索引数组] echo jso ...