UVA11987Almost Union-Find(并查集删除节点)
题意: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(并查集删除节点)的更多相关文章
- hdu2473 Junk-Mail Filter 并查集+删除节点+路径压缩
Description Recognizing junk mails is a tough task. The method used here consists of two steps: 1) ...
- 洛谷UVA11987Almost Union-Find题解--并查集的删除
题目链接 https://www.luogu.org/problemnew/show/UVA11987 分析 分析下操作发现就是加了个删除操作的并查集,怎么做删除操作呢. 我们用一个\(id[]\)记 ...
- Hdu 2473(并查集删除操作) Junk-Mail Filter
有木有非常吊 加强 加强版 啊 ,看了都不敢做了 .后来先做了食物链这个我还是看过的.但还是A不掉,没明确神魔意思 .总而言之.大牛的博客是个好东西.我就那么看了一下,还是不懂怎莫办啊,哎, ...
- HDU 2473 Junk-Mail Filter 【并查集删除】
Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 并查集(删除) UVA 11987 Almost Union-Find
题目传送门 题意:训练指南P246 分析:主要是第二种操作难办,并查集如何支持删除操作?很巧妙的方法:将并查集树上p的影响消除,即在祖先上(sz--, sum -= p),然后为p换上马甲:id[p] ...
- HDU 5441 Travel(并查集+统计节点个数)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...
- 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~ ...
- HDU2473 Junk-Mail Filter - 并查集删除操作(虚父节点)
传送门 题意: 每次合并两份邮件,或者将某一份邮件独立出来,问最后有多少个邮件集合. 分析: 考虑初始化每个节点的祖先为一个虚父节点(i + n),虚父节点指向它自己.这样可以进行正常的合并操作. 而 ...
- UVA - 11987 Almost Union-Find[并查集 删除]
UVA - 11987 Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, y ...
随机推荐
- 【转】Java 项目UML反向工程转化工具
原文链接:http://www.cnblogs.com/bakari/p/3561207.html 今天在看一个模拟器的源码,一个包里有多个类,一个类里又有多个属性和方法,如果按顺序看下来,不仅不能对 ...
- mysql 定义自增
The database returned no natively generated identity value问题 alter table user_table MODIFY user_id I ...
- canvas缓动2
同之前的缓动原理.这里将终点换成鼠标,做出跟随效果 var canvas = document.getElementById("canvas"); var cxt=canvas.g ...
- Java垃圾收集算法介绍
垃圾回收器GC(Garbage Collection) 一.引用计数算法(Reference Counting) 介绍:给对象添加一个引用计数器,每当一个地方引用它时,数据器加1:当引用失效时,计数器 ...
- lucene-查询query->PhraseQuery多关键字的搜索
用户在搜索引擎中进行搜索时,常常查找的并非是一个简单的单词,很有可能是几个不同的关键字.这些关键字之间要么是紧密相联,成为一个精确的短 语,要么是可能在这几个关键字之间还插有其他无关的关键字.此时,用 ...
- sql-将查询字段拼接起来
sql语句 select (a + b) as c mysql不起作用
- HTTP协议学习---(五)压缩
HTTP压缩是指: Web服务器和浏览器之间压缩传输的"文本内容"的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...
- linux如何查看系统占用磁盘空间最大的文件及让文件按大小排序
[root@localhost web_bak] find / -type f -size +10G在Linux下如何让文件让按大小单位为M,G等易读格式,S size大小排序. [root@loc ...
- Web性能测试基本指标
Web性能测试基本指标 Web性能测试的部分概况一般来说,一个Web请求的处理包括以下步骤: (1)客户发送请求 (2)web server接受到请求,进行处理: (3)web server向DB获取 ...
- JQuery 判断浏览器及其版本
JQuery 中用 方法 jQuery.browser 来判断浏览器,返回值可以为: safari opera msie mozilla. 当然有时候我们还需要区分版本 这就要用到 jQuery.br ...