Problem - 2473

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

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

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

代码如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <set>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <stack>
  7.  
  8. using namespace std;
  9.  
  10. const int N = ;
  11. stack<int> tmp;
  12.  
  13. struct MFS {
  14. set<int> sn[N];
  15. int fa[N];
  16. void init() { for (int i = ; i < N; i++) fa[i] = i, sn[i].clear(), sn[i].insert(i);}
  17. int find(int x) {
  18. while (!tmp.empty()) tmp.pop();
  19. while (fa[x] != x) {
  20. tmp.push(x);
  21. sn[fa[x]].erase(x);
  22. x = fa[x];
  23. }
  24. while (!tmp.empty()) {
  25. fa[tmp.top()] = x;
  26. sn[x].insert(tmp.top());
  27. tmp.pop();
  28. }
  29. return x;
  30. }
  31. void merge(int x, int y) {
  32. int fx = find(x), fy = find(y);
  33. if (fx == fy) return ;
  34. sn[fa[fy]].erase(fy);
  35. fa[fy] = fx;
  36. sn[fx].insert(fy);
  37. }
  38. void reset(int x) {
  39. set<int>::iterator si = sn[x].begin();
  40. if (fa[x] == x) {
  41. if (*si == x) si++;
  42. if (si == sn[x].end()) return ;
  43. int t = *si;
  44. fa[t] = t;
  45. sn[t].insert(t);
  46. si++;
  47. while (si != sn[x].end()) {
  48. if (*si == x) { si++; continue;}
  49. fa[*si] = t;
  50. sn[t].insert(*si);
  51. si++;
  52. }
  53. } else {
  54. int fx = find(x);
  55. sn[fx].erase(x);
  56. while (si != sn[x].end()) {
  57. fa[*si] = fx;
  58. sn[fx].insert(*si);
  59. si++;
  60. }
  61. }
  62. fa[x] = x;
  63. sn[x].clear();
  64. sn[x].insert(x);
  65. }
  66. } mfs;
  67. bool vis[N];
  68.  
  69. int main() {
  70. // freopen("in", "r", stdin);
  71. int n, m, x, y, cas = ;
  72. char op[];
  73. while (~scanf("%d%d", &n, &m) && (n || m)) {
  74. mfs.init();
  75. for (int i = ; i < m; i++) {
  76. scanf("%s", op);
  77. if (op[] == 'M') {
  78. scanf("%d%d", &x, &y);
  79. //mfs.reset(y);
  80. mfs.merge(x, y);
  81. } else {
  82. scanf("%d", &x);
  83. mfs.reset(x);
  84. }
  85. // for (int i = 0; i < 3; i++) cout << mfs.fa[i] << ' '; cout << endl;
  86. }
  87. memset(vis, , sizeof(vis));
  88. int cnt = ;
  89. for (int i = , t; i < n; i++) {
  90. t = mfs.find(i);
  91. if (vis[t]) continue;
  92. cnt++;
  93. vis[t] = true;
  94. }
  95. printf("Case #%d: %d\n", cas++, cnt);
  96. }
  97. return ;
  98. }
  99.  
  100. /*
  101. 5 6
  102. M 0 1
  103. M 1 2
  104. M 1 3
  105. S 1
  106. M 1 2
  107. S 3
  108.  
  109. 3 4
  110. M 1 2
  111. M 0 1
  112. S 1
  113. S 0
  114.  
  115. 0 0
  116. */

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

——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. leetcode 839 Similar String Groups

    题目 Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that ...

  2. Nginx 编译设置模块执行顺序

    Nginx编译时,配置"--add-module=xxx"可以加入模块,当我们需要按照指定顺序来设置过滤模块执行顺序时,先配置的"--add-module=xxx&quo ...

  3. bzoj 2705 [SDOI2012]Longge的问题——欧拉函数大水题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2705 撕逼题.不就是枚举gcd==d,求和phi[ n/d ]么. 然后预处理sqrt (n ...

  4. 初次接触python的re模块

    刷CF的时候,看到一个简单的题目,可以用来练练正则表达式 于是乎找到了re.sub的用法,说明如下 re.sub: (pattern, repl, string, count=0, │       f ...

  5. 【JZOJ3598】【CQOI2014】数三角形

    Mission 对于100%的数据1<=m,n<=1000 Solution 鬼题,ans=C3(n∗m)−Ans,其中Ans表示三点共线的数目: 枚举最长边的向量(x,y),容易算出贡献 ...

  6. Mybatis - plus 配置与运用

    Mybatis - plus mybatis-plus 官方文档  1.配置 引入对应的文件包,spring boot + mybatis 需添加依赖文件如下: <dependencies> ...

  7. C++之正则表示,字符串是否为全字母或者全数字

    bool isLetter(std::string& inputtext){ tr1::regex reg("^[A-Za-z]+$"); bool bValid = tr ...

  8. java jsp j2ee

    1. JavaScript用于编写嵌入在网页文档中的程序,它由浏览器负责解释和执行,可以在网页上产生动态的显示效果和实现与用户交互的功能,譬如,让一串文字跟着鼠标移动,让一个图标在网页漂浮移动,验证用 ...

  9. xcode自动完成代码 Code Snippet Library

    今天发现Xcode里一个好东西:代码片段库 你可以将自己常用的代码放到里面,给它命名,设置快捷键,以后想用这段代码的时候只要按快捷键,就会出现提示,直接将这段代码显示出来,十分高效. 比如我经常会用到 ...

  10. 【JZOJ3852】【NOIP2014八校联考第2场第2试9.28】单词接龙(words)

    DDD Bsny从字典挑出N个单词,并设计了接龙游戏,只要一个单词的最后两个字母和另一个单词的前两个字母相同,那么这两个单词就可以有序的连接起来. Bsny想要知道在所给的所有单词中能否按照上述方式接 ...