poj1611 简单题

代码中id记录父节点,sz记录子树规模。一个集合为一棵树。

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4.  
  5. int id[300005];
  6. int sz[300005];
  7.  
  8. void add(int a, int b)
  9. {
  10. int i, j;
  11. for (i = a; i != id[i]; i = id[i]);
  12. for (j = b; j != id[b]; j = id[j]);
  13. if (i == j) return;
  14. if (sz[i] < sz[j]) {
  15. id[i] = j;
  16. sz[j] += sz[i];
  17. } else {
  18. id[j] = i;
  19. sz[i] += sz[j];
  20. }
  21. }
  22.  
  23. int main()
  24. {
  25. int n, m, cnt, root, temp;
  26. while (scanf("%d%d", &n, &m) != EOF) {
  27. if (!n) break;
  28. for (int i = 0; i < n; ++i) {
  29. id[i] = i;
  30. sz[i] = 1;
  31. }
  32. for (int i = 0; i < m; ++i) {
  33. scanf("%d", &cnt);
  34. scanf("%d", &root);
  35. for (int j = 1; j < cnt; ++j) {
  36. scanf("%d", &temp);
  37. add(root, temp);
  38. }
  39. }
  40. int ans = 0;
  41. int rt;
  42. for (rt = 0; rt != id[rt]; rt = id[rt]);
  43. for (int i = 0; i < n; ++i) {
  44. int j;
  45. for (j = i; j != id[j]; j = id[j]);
  46. if (j == rt) ++ans;
  47. }
  48. printf("%d\n", ans);
  49. }
  50. return 0;
  51. }

  

poj 2492

题目也是醉了,看半天没看懂= =#

输入每对a b表示a和b是夫妻,问有没有同性恋= =

把每一次a b放入同一集合,并用rel记录每个节点和它父节点的相对关系。这样同一集合的任意两点间关系就确定了

  1. /**********************************************
  2. Memory: 8500 KB Time: 125 MS
  3. Language: G++ Result: Accepted
  4. ***********************************************/
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <cstring>
  8. using namespace std;
  9.  
  10. int id[2010], sz[2010];
  11. int a[1000005], b[1000005];
  12. int rel[2010]; //和父节点的性别是否一致,一致为0,否则为1
  13.  
  14. int Scan() { //输入外挂
  15. int res = 0, flag = 0;
  16. char ch;
  17. if((ch = getchar()) == '-') flag = 1;
  18. else if(ch >= '0' && ch <= '9') res = ch - '0';
  19. while((ch = getchar()) >= '0' && ch <= '9')
  20. res = res * 10 + (ch - '0');
  21. return flag ? -res : res;
  22. }
  23.  
  24. void add(int a, int b)
  25. {
  26. int i, j;
  27. int rel_a = 0, rel_b = 0;
  28. for (i = a; i != id[i]; i = id[i])
  29. rel_a = (rel_a + rel[i]) % 2;  //a和根节点的关系
  30. for (j = b; j != id[j]; j = id[j])
  31. rel_b = (rel_b + rel[j]) % 2;  //b和根节点的关系
  32. if (i == j) return ;
  33. if (sz[i] <= sz[j]) { //i->j
  34. sz[j] += sz[i];
  35. id[i] = j;
  36. rel[i] = (rel_a == rel_b) ? 1 : 0;
  37.  
  38. } else { //j->i
  39. sz[i] += sz[j];
  40. id[j] = i;
  41. rel[j] = (rel_a == rel_b) ? 1 : 0;
  42. }
  43. }
  44.  
  45. int is_gay(int a, int b)
  46. {
  47. int i, j;
  48. int rel_a = 0, rel_b = 0;
  49. for (i = a; i != id[i]; i = id[i])
  50. rel_a = (rel_a + rel[i]) % 2;
  51. for (j = b; j != id[j]; j = id[j])
  52. rel_b = (rel_b + rel[j]) % 2;
  53. if (i == j && rel_a == rel_b)
  54. return 1;
  55. return 0;
  56. }
  57.  
  58. int main()
  59. {
  60. int t, m, n;
  61. t = Scan();
  62. for (int k = 1; k <= t; ++k) {
  63. n = Scan();
  64. m = Scan();
  65. for (int i = 1; i <= n; ++i) {
  66. id[i] = i;
  67. sz[i] = 1;
  68. rel[i] = 0;
  69. }
  70. for (int i = 0; i < m; ++i) {
  71. a[i] = Scan();
  72. b[i] = Scan();
  73. add(a[i], b[i]);
  74. }
  75. int i;
  76. for (i = 0; i < m; ++i) {
  77. if (is_gay(a[i], b[i]))
  78. break;
  79. }
  80. printf("Scenario #%d:\n%s\n\n", k, i == m ? "No suspicious bugs found!" : "Suspicious bugs found!");
  81. }
  82. return 0;
  83. }

  

总结经验教训:以后多敲两行也不能复制粘贴= =太坑。。。

并查集 poj1611&poj2492的更多相关文章

  1. 并查集——poj1611(入门)

    传送门:The Suspects 并查集水题 #include <iostream> #include <cstdio> #include <algorithm> ...

  2. 【转】并查集&MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

  3. poj2492 A Bug's Life(带权并查集)

    题目链接 http://poj.org/problem?id=2492 题意 虫子有两种性别,有n只虫子,编号1~n,输入m组数据,每组数据包含a.b两只虫子,表示a.b为不同性别的虫子,根据输入的m ...

  4. poj1611 The Suspects(并查集)

    题目链接 http://poj.org/problem?id=1611 题意 有n个学生,编号0~n-1,m个社团,每个社团有k个学生,如果社团里有1个学生是SARS的疑似患者,则该社团所有人都要被隔 ...

  5. poj2492(种类并查集/各种解法)

    题目链接: http://poj.org/problem?id=2492 题意: 有t组测试数据, 对于每组数据,第一行n, m分别表示昆虫的数目和接下来m行x, y, x, y表示教授判断x, y为 ...

  6. poj1611(并查集)

    题目链接:http://poj.org/problem?id=1611 题意: SARS(非典型肺炎)传播得非常厉害,其中最有效的办法是隔离那些患病.和患病者接触的人.现在有几个学习小组,每小组有几个 ...

  7. poj1611 并查集 (路径不压缩)

    http://poj.org/problem?id=1611 题目大意: 有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社 ...

  8. poj2492 带权并查集

    题意:研究一种生物,有n个生物个体,发现有一些之间进行了交配,给出了这些关系,问是否有同性恋的bug出现. 用0\1表示某元素和其祖先元素的性别关系,0 为相同,1 为不同,用 mod2 实现累计处理 ...

  9. poj1611 带权并查集

    题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染. 带权并查 ...

随机推荐

  1. 微信web开发者工具调试

    微信web开发者工具调试 前几天写了一篇使用fiddler调试微信端页面的,然后博友评论说使用fiddler太麻烦了,推荐使用微信web开发者工具调试微信页面,这两天弄着玩了一下,很强大.这篇文章只是 ...

  2. Android XML文件解析

    在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...

  3. 求解 s = (1*1)!+(2*2)! + (3*3)!+...+(n*n)! (C语言)

    提示:定义函数可以求阶乘,再定义函数求阶乘之和.1和0的阶乘是1,n(n > 1)的阶乘是n * (n-1) * (n - 2) * … * 1 //采用了函数嵌套调用和函数递归调用 //求解阶 ...

  4. 在C#中关于excel的导入和导出操作

    一.先来看看最常见的导入操作吧! private void Import() { //打开excel选择框 OpenFileDialog frm = new OpenFileDialog(); frm ...

  5. 南方数据企业0day

    漏洞影响版本 v10.0 v11.0 关键字:inurl:”HomeMarket.asp” 默认后台:/admin 直接爆用户密码: http://www.xxx.com/NewsType.asp?S ...

  6. 1008: [HNOI2008]越狱

    n个人,m种信仰: 问你相邻的人信仰不同的情况有多少种? 首先第一个人有m种选择,第二个人有m-1种选择,后面所有的人都只有m-1种选择: 所以结果就是m^n-m*(m-1)^(n-1) #inclu ...

  7. DataTable转换List<T>集合的方法

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data; ...

  8. POJ 3352 Road Construction (边双连通分量)

    题目链接 题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点 思路 :把景点看成点,路看成边,看要 ...

  9. easyui源码翻译1.32--Calendar(日历)

    前言 前几天加班比较忙 未能及时更新翻译的 今天多发布几篇..下载该插件翻译源码 日历控件显示一个月的日历,允许用户选择日期和移动到下一个或上一个月.默认情况下,一周的第一天是周日.它可以通过设置'f ...

  10. VIM 及其插件使用快捷键汇总

    我的博客:www.while0.com vim搜索取消高亮 :nohl