HDU 2473 Junk-Mail Filter 并查集,虚拟删除操作
http://acm.hdu.edu.cn/showproblem.php?pid=2473
给定两种操作
第一种是合并X Y
第二种是把X分离出来,就是从原来的集合中分离出来,其它的关系不变。
关键是怎么分离,可以考虑把它变成一个其它值。HASH[i] = other_val
然后用新值去做并查集即可、
需要注意的一点就是
假如现在根是1,fa[1] = 1, fa[2] = 1, fa[3] = 1
那么如果你删除了1,这应该输出2.但是现在是fa[2] = 1,是一个不存在的根了,这个时候ans应该+1,但是按照并查集的思路
if (find(HASH[i]) == HASH[i]) ans++ 是不行的,因为这个根已经不存在了。
解决方法就是标记是否为虚根,del[i] = true表示删除了,但是枚举fa[3]的时候就要避免重新加,需要取消标记。
如果这时再有M 4 2,那么就把fa[4] = 1,用虚根表示即可。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 2e6 + ;
int fa[maxn];
int HASH[maxn];
bool del[maxn];
void init() {
memset(del, , sizeof del);
for (int i = ; i < maxn; ++i) fa[i] = i;
for (int i = ; i < maxn; ++i) HASH[i] = i;
}
int find(int u) {
if (fa[u] == u) return u;
else return fa[u] = find(fa[u]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
fa[y] = x;
}
}
int n, m;
int ff;
void work() {
init();
int t = n;
for (int i = ; i <= m; ++i) {
char str[];
int a, b;
scanf("%s", str);
if (str[] == 'M') {
scanf("%d%d", &a, &b);
merge(HASH[a], HASH[b]);
} else {
scanf("%d", &a);
del[HASH[a]] = ;
HASH[a] = n++;
}
}
int ans = ;
for (int i = ; i < t; ++i) {
if (find(HASH[i]) == HASH[i]) ans++;
if (del[find(HASH[i])]) {
del[find(HASH[i])] = ;
ans++;
}
}
// cout << find(2) << endl;
printf("Case #%d: %d\n", ++ff, ans);
return;
} int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
while (scanf("%d%d", &n, &m) != EOF && (n + m)) {
work();
}
return ;
}
4 7
M 0 1
M 2 3
M 1 3
S 1
S 2
S 3
S 0
3 3
M 0 1
M 0 2
S 0
给些数据
HDU 2473 Junk-Mail Filter 并查集,虚拟删除操作的更多相关文章
- HDU 2473 Junk-Mail Filter(并查集的删除操作)
题目地址:pid=2473">HDU 2473 这题曾经碰到过,没做出来. .如今又做了做,还是没做出来. ... 这题涉及到并查集的删除操作.想到了设一个虚节点,可是我把虚节点设为了 ...
- [HDOJ2473]Junk-Mail Filter(并查集,删除操作,马甲)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2473 给两个操作:M X Y:将X和Y看成一类. S X:将X单独划归成一类. 最后问的是有多少类. ...
- hdu 2473 Junk-Mail Filter (并查集之点的删除)
Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 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~ ...
- HDU 2473 Junk-Mail Filter(并查集+删点,设立虚父节点/找个代理)
题意:有N封邮件, 然后又两种操作,如果是M X Y , 表示X和Y是相同的邮件.如果是S X,那么表示对X的判断是错误的,X是不属于X当前所在的那个集合,要把X分离出来,让X变成单独的一个.最后问集 ...
- (step5.1.2)hdu 2473(Junk-Mail Filter——并查集)
题目大意:输入两个整数n,m(n表示点的个数,m表示操作数).在接下来的m行中,对点的操作有两种 1)M a b . 表示将a.b并到一个集合中 2)S a .表示将a从原来的集合中去除,而成为一个单 ...
- hdu2473 Junk-Mail Filter 并查集+删除节点+路径压缩
Description Recognizing junk mails is a tough task. The method used here consists of two steps: 1) ...
- HDU HDU1558 Segment set(并查集+判断线段相交)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一 ...
- hdu 1257 小希的迷宫 并查集
小希的迷宫 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 D ...
随机推荐
- 洛谷【P1480】A/B Problem
题目传送门:https://www.luogu.org/problemnew/show/P1480 高精除低精板子题,灵性地回忆一下小学时期列竖式的草稿纸即可. 时间复杂度:\(O(len)\) 空间 ...
- 删除老的Azure Blob Snapshot
客户有这样的需求:每天需要对VM的数据进行备份,但如果备份的时间超过一定的天数,需要进行清除. 本文也是在前一篇Azure Blob Snapshot上的优化. "Azure blob St ...
- java web基础学习 Forward和Redirect区别
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发.对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的s ...
- JS计算文件的md5
首先需要引入js文件(二选一): https://raw.github.com/satazor/SparkMD5/master/spark-md5.js https://github.com/sata ...
- (转)JAVA中的权限修饰符
注:本博文是转载的,原文地址:http://blog.csdn.net/xk632172748/article/details/51755438 Java中修饰符总结: 访问控制修饰符 访问控制修饰符 ...
- [原创]Javascript 利用mousetrap.js进行键盘事件操作
我们日常开发中,会遇到js的键盘操作,例如回车提交表单之类的.或者按下某个键执行某个方法.无意中发现一个大小不到4K的js文件,它非常方便的操作键盘事件. 自己也尝试了一下:具体代码如下: 详情可以去 ...
- p3627&bzoj1179 抢掠计划(ATM)
传送门(洛谷) 传送门(bzoj) 题目 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的 ...
- Haskell语言为什么值得你去学习
摘自http://www.vaikan.com/why-haskell-is-worth-learning/ Haskell语言为什么值得你去学习 当我向一些新手推荐学习Haskell语言时,得到的反 ...
- 项目:IT资源共享资源(登录前端)<1>
公众号技术标签 小程序 PHP 源码 项目 IT资源共享项目 这是前年自己收集了一些网络开发资源,上传到百度网盘,提供积分兑换.上线后用户在两个月内达到3427人,其中用java,PHP,前端,Pyt ...
- Struts2 源码分析-----拦截器源码解析 --- ParametersInterceptor
ParametersInterceptor拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈顶是当前Action则把请求参数设置到了Action中,如果栈顶 ...