Problem - 2473

  为什么标题写的是暴力并查集?因为我的解法跟网上的有所不同,方法暴力很多。

  先解释题意,这是一个模拟处理垃圾邮件的问题。垃圾邮件要根据它们的性质进行分类。对于10w个邮件,操作M是这两个邮件具有相同的属性,属性是可以传递的,也就是说,1和2有相同属性,2和3有相同属性,那么1和3就有相同属性。操作S是将这个邮件分离出来,不和任何的邮件有相同属性。最后问不同属性的邮件有多少种。这么看来,这是一个并查集。网上的正解,是把那个删除的结点当成虚拟结点,继续放在那里。然后重新开一个新的结点来存放分离出来的结点。

  而我的做法则是直接构造并查集树,我的树是会记录子结点有那些的,更新的时候就只能直接暴力更新了。

代码如下:

 #include <iostream>
#include <algorithm>
#include <set>
#include <cstring>
#include <cstdio>
#include <stack> using namespace std; const int N = ;
stack<int> tmp; struct MFS {
set<int> sn[N];
int fa[N];
void init() { for (int i = ; i < N; i++) fa[i] = i, sn[i].clear(), sn[i].insert(i);}
int find(int x) {
while (!tmp.empty()) tmp.pop();
while (fa[x] != x) {
tmp.push(x);
sn[fa[x]].erase(x);
x = fa[x];
}
while (!tmp.empty()) {
fa[tmp.top()] = x;
sn[x].insert(tmp.top());
tmp.pop();
}
return x;
}
void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx == fy) return ;
sn[fa[fy]].erase(fy);
fa[fy] = fx;
sn[fx].insert(fy);
}
void reset(int x) {
set<int>::iterator si = sn[x].begin();
if (fa[x] == x) {
if (*si == x) si++;
if (si == sn[x].end()) return ;
int t = *si;
fa[t] = t;
sn[t].insert(t);
si++;
while (si != sn[x].end()) {
if (*si == x) { si++; continue;}
fa[*si] = t;
sn[t].insert(*si);
si++;
}
} else {
int fx = find(x);
sn[fx].erase(x);
while (si != sn[x].end()) {
fa[*si] = fx;
sn[fx].insert(*si);
si++;
}
}
fa[x] = x;
sn[x].clear();
sn[x].insert(x);
}
} mfs;
bool vis[N]; int main() {
// freopen("in", "r", stdin);
int n, m, x, y, cas = ;
char op[];
while (~scanf("%d%d", &n, &m) && (n || m)) {
mfs.init();
for (int i = ; i < m; i++) {
scanf("%s", op);
if (op[] == 'M') {
scanf("%d%d", &x, &y);
//mfs.reset(y);
mfs.merge(x, y);
} else {
scanf("%d", &x);
mfs.reset(x);
}
// for (int i = 0; i < 3; i++) cout << mfs.fa[i] << ' '; cout << endl;
}
memset(vis, , sizeof(vis));
int cnt = ;
for (int i = , t; i < n; i++) {
t = mfs.find(i);
if (vis[t]) continue;
cnt++;
vis[t] = true;
}
printf("Case #%d: %d\n", cas++, cnt);
}
return ;
} /*
5 6
M 0 1
M 1 2
M 1 3
S 1
M 1 2
S 3 3 4
M 1 2
M 0 1
S 1
S 0 0 0
*/

  用虚拟结点的方法将会尽快更新。

——written by Lyon

hdu 2473 Junk-Mail Filter (暴力并查集)的更多相关文章

  1. HDU 5631 Rikka with Graph 暴力 并查集

    Rikka with Graph 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5631 Description As we know, Rikka ...

  2. hdu 5458 Stability(树链剖分+并查集)

    Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total ...

  3. [HDU 3712] Fiolki (带边权并查集+启发式合并)

    [HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...

  4. 2016蓝桥杯省赛C/C++A组第七题 剪邮票(暴力+并查集)

    题意:有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连) 分析:暴力+并查集. 1.记录下每个数字所在位置. 2.先枚举各不相同的5个数的所有可能情 ...

  5. HDU 2473 - Junk-Mail Filter ,并查集的删点

    Problem Description Recognizing junk mails is a tough task. The method used here consists of two ste ...

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

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

  7. hdu 2473 Junk-Mail Filter(并查集_虚节点)2008 Asia Regional Hangzhou

    感觉有些难的题,刚开始就想到了设立虚节点,但是实现总是出错,因为每次设立了虚节点之后,无法将原节点和虚节点分开,导致虚节点根本无意义. 以上纯属废话,可以忽略…… 题意—— 给定n个点(0, 1, 2 ...

  8. hdu 2473 Junk-Mail Filter(并查集)

    题意: N个邮件需要鉴别. 两种操作: 1. M X Y:X和Y是同一种邮件 2.S X:X被误判(意味着X要被它从属的那个集合"踢出去"而所有其它的邮件的关系保持不变) 问最后总 ...

  9. hdoj 2473 Junk-Mail Filter【并查集节点的删除】

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

随机推荐

  1. spring JdbcTemplate最基本的使用

    package com.com.jdbctemplate; import org.springframework.jdbc.core.JdbcTemplate; import org.springfr ...

  2. 006-使用python编写一个猜数字的程序

    题目:随机生成一个数字,共有三次机会对该数字进行猜测. #功能点# 1.猜错的时候给出提示,告诉用户输入的值是大了还是小了# 2.最多提供三次机会# 3.随机生成需要猜的数字答案 编写思路: 1.刚开 ...

  3. 模板方法(Template Method)(父类声明算法骨架,子类具体不同实现)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  4. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  5. 【模板】KMP [2017年5月计划 清北学堂51精英班Day2]

    Day2就搞一个KMP把  马拉车.AC自动机等准备省选的时候再说.. 模板题: 1204 寻找子串位置 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze     ...

  6. R语言可视化--qplot函数

    ggplot绘图系统 使用动词名词形容词构造句子的过程,将数据映射到美学属性上的过程,由层组成 绘图函数 qplot() :参数包括美学属性.几何体.面.统计.坐标系.主题这些层次. ggplot() ...

  7. 常见的php攻击(6种攻击详解)

    1.SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行.还有一种是通过system()或exec()命令注入的,它具有相同的SQL注入机制,但只针对sh ...

  8. 可复用且高度解耦的iOS用户统计实现

    http://www.cocoachina.com/ios/20160421/15912.html 本文为投稿文章,作者:编程小翁(简书) 用户统计 用户行为统计(User Behavior Stat ...

  9. ios开发ARC,IBOutlets之strong与weak

    今天在写程序的时候,用IBOutlets连了一个自定义的控件,出现了问题,后面访问的时候,控件里有些subviews没有初始化好,取到的时候为nil, 程序里用了ARC, IBOutlets一连接上, ...

  10. linux服务器配置防火墙使用端口

    重启后生效方法: 1.开启: chkconfig iptables on 2.关闭: chkconfig iptables off  即时生效,重启后失效 : 1.开启: service iptabl ...