HDU2473 Junk-Mail Filter - 并查集删除操作(虚父节点)
题意:
每次合并两份邮件,或者将某一份邮件独立出来,问最后有多少个邮件集合。
分析:
考虑初始化每个节点的祖先为一个虚父节点(i + n),虚父节点指向它自己。这样可以进行正常的合并操作。
而在删除时,将该节点的祖先置为一个更大的数(++anc_cnt),并让该anc_cnt指向它自己,这样不会影响与自身节点相连的所有关系。最后统计有多少个不同的祖先即可。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, M = 1e6 + 5;
int n, anc[N * 12], x, y, vt, k, m, anc_cnt, ans, vst[N * 12];
char opt[5];
inline int getAnc(int x){return x == anc[x] ? x : (anc[x] = getAnc(anc[x]));}
inline void merge(int x, int y){
int fx = getAnc(x), fy = getAnc(y);
if(fx != fy) anc[fx] = fy;
}
inline void del(int x){anc[x] = ++anc_cnt; anc[anc_cnt] = anc_cnt;}
int main(){
freopen("h.in", "r", stdin);
while(scanf("%d%d", &n, &m) && (n + m)){
for(int i = 1; i <= n; i++) anc[i] = i + n, anc[i + n] = i + n;
anc_cnt = n * 2, ans = 0; vt++;
for(int i = 1; i <= m; i++){
scanf("%s", opt + 1);
if(opt[1] == 'M'){
scanf("%d%d", &x, &y);
x++, y++;
merge(x, y);
}
else{
scanf("%d", &x);
x++;
del(x);
}
}
for(int i = 1; i <= n; i++){
int f = getAnc(i);
if(vst[f] != vt) ans++;
vst[f] = vt;
}
printf("Case #%d: %d\n", ++k, ans);
}
return 0;
}
HDU2473 Junk-Mail Filter - 并查集删除操作(虚父节点)的更多相关文章
- hdu2473 Junk-Mail Filter 并查集+删除节点+路径压缩
Description Recognizing junk mails is a tough task. The method used here consists of two steps: 1) ...
- Hdu 2473(并查集删除操作) Junk-Mail Filter
有木有非常吊 加强 加强版 啊 ,看了都不敢做了 .后来先做了食物链这个我还是看过的.但还是A不掉,没明确神魔意思 .总而言之.大牛的博客是个好东西.我就那么看了一下,还是不懂怎莫办啊,哎, ...
- 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变成单独的一个.最后问集 ...
- Junk-Mail Filter 【并查集虚父节点】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2473 题目大意: n个点,m个操作,操作时,输入M a b,表示a, b在一个集合里, 输入S a 表 ...
- 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 【并查集删除】
Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 2473 Junk-Mail Filter(并查集的删除操作)
题目地址:pid=2473">HDU 2473 这题曾经碰到过,没做出来. .如今又做了做,还是没做出来. ... 这题涉及到并查集的删除操作.想到了设一个虚节点,可是我把虚节点设为了 ...
- HDU 2473 Junk-Mail Filter 并查集,虚拟删除操作
http://acm.hdu.edu.cn/showproblem.php?pid=2473 给定两种操作 第一种是合并X Y 第二种是把X分离出来,就是从原来的集合中分离出来,其它的关系不变. 关键 ...
随机推荐
- 洛谷 P1416 攻击火星
P1416 攻击火星 题目描述 一群外星人将要攻击火星. 火星的地图是一个n个点的无向图.这伙外星人将按照如下方法入侵,先攻击度为0的点(相当于从图中删除掉它),然后是度为1的点,依此类推直到度为n- ...
- C语言速度优化之指针赋值与if推断
近期在写的一个项目须要优化处理速度,我写了一下程序来測试指针赋值与指针推断的速度比較.结果让我大吃一惊. #include <stdio.h> #include <stdlib.h& ...
- 一筐梨子&一筐水果——协变性(covariant)
假设突然看见这个问题.我们常常会想当然. 一个梨子是水果,一筐梨子是一筐水果吗? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXFqMjA2NQ==/f ...
- Mycat快速入门
1.Mycat介绍 Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以 ...
- Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品
[详细]Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品 最近在用Notepad++,发现的确是很不错的工具,具体特色,看了下面介绍就知道了. [ ...
- python把一个列表画柱状图
https://blog.csdn.net/w113691/article/details/80385534
- @RequestMapping value 能够反复吗 [
@RequestMapping value 能够反复吗 [问题点数:40分,结帖人wangqiao4j] 不显示删除回复显示全部回复 显示星级回复显示得分回复 仅仅显示楼主 u=http://bbs. ...
- windows 开机总动运行bat文件
抄自 https://blog.csdn.net/csdnliuxin123524/article/details/78949803 就是把bat文件放到 开始->启动 的那个文件夹里就可 ...
- sprinng in action 第四版第六章中的ValidationMessages.properties不起作用
文件名必须是ValidationMessages.properties,必须放在类的根目录下
- 10.13 android输入系统_多点触摸驱动理论与框架
1.多点触摸驱动理论 驱动程序仅上报多个触点的位置就可以,是放大还是缩小由应用程序控制 对于多点触摸驱动在linux系统中有个输入子系统,其已经实现了open/read/write等接口 我们只需要实 ...