题目链接

题意: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. 【转】Java 项目UML反向工程转化工具

    原文链接:http://www.cnblogs.com/bakari/p/3561207.html 今天在看一个模拟器的源码,一个包里有多个类,一个类里又有多个属性和方法,如果按顺序看下来,不仅不能对 ...

  2. mysql 定义自增

    The database returned no natively generated identity value问题 alter table user_table MODIFY user_id I ...

  3. canvas缓动2

    同之前的缓动原理.这里将终点换成鼠标,做出跟随效果 var canvas = document.getElementById("canvas"); var cxt=canvas.g ...

  4. Java垃圾收集算法介绍

    垃圾回收器GC(Garbage Collection) 一.引用计数算法(Reference Counting) 介绍:给对象添加一个引用计数器,每当一个地方引用它时,数据器加1:当引用失效时,计数器 ...

  5. lucene-查询query->PhraseQuery多关键字的搜索

    用户在搜索引擎中进行搜索时,常常查找的并非是一个简单的单词,很有可能是几个不同的关键字.这些关键字之间要么是紧密相联,成为一个精确的短 语,要么是可能在这几个关键字之间还插有其他无关的关键字.此时,用 ...

  6. sql-将查询字段拼接起来

    sql语句 select (a + b) as c mysql不起作用

  7. HTTP协议学习---(五)压缩

    HTTP压缩是指: Web服务器和浏览器之间压缩传输的"文本内容"的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...

  8. linux如何查看系统占用磁盘空间最大的文件及让文件按大小排序

    [root@localhost web_bak]  find / -type f -size +10G在Linux下如何让文件让按大小单位为M,G等易读格式,S size大小排序. [root@loc ...

  9. Web性能测试基本指标

    Web性能测试基本指标 Web性能测试的部分概况一般来说,一个Web请求的处理包括以下步骤: (1)客户发送请求 (2)web server接受到请求,进行处理: (3)web server向DB获取 ...

  10. JQuery 判断浏览器及其版本

    JQuery 中用 方法 jQuery.browser 来判断浏览器,返回值可以为: safari opera msie mozilla. 当然有时候我们还需要区分版本 这就要用到 jQuery.br ...