食物链
 
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 41584   Accepted: 12090

Description

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。

有人用两种说法对这N个动物所构成的食物链关系进行描述:

第一种说法是"1 X Y",表示X和Y是同类。

第二种说法是"2 X Y",表示X吃Y。

此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

1) 当前的话与前面的某些真的话冲突,就是假话;

2) 当前的话中X或Y比N大,就是假话;

3) 当前的话表示X吃X,就是假话。

你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。

Input

第一行是两个整数N和K,以一个空格分隔。

以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。

若D=1,则表示X和Y是同类。

若D=2,则表示X吃Y。

Output

只有一个整数,表示假话的数目。

Sample Input

  1. 100 7
  2. 1 101 1
  3. 2 1 2
  4. 2 2 3
  5. 2 3 3
  6. 1 1 3
  7. 2 3 1
  8. 1 5 5

Sample Output

  1. 3
    注意:此题只有一组输入数据就行了,多组的话,就出错了;
  1. /*
  2. 讲解:这道题也是并查集的应用,相比其他的来说,增加了两者之间的关系,而不是直接统计合并两个数组;
  3. 0 代表两者是同类;
  4. 1 代表被父亲吃;
  5. 2 代表吃掉父亲;
  6. 基本上这一类的题目都是用的这一种方法,理解之后就能套用了;
  7. */
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<algorithm>
  11. #include<cstring>
  12. #include<string>
  13. #include<cmath>
  14. #include<map>
  15. #include<queue>
  16. using namespace std;
  17. int n,k;
  18. struct T
  19. {
  20. int parent,relation;
  21. }tree[];
  22. void begin() // 初始化时,自己的父亲是自己
  23. { // 关系全部初始化为0
  24. for(int i=; i<=n; i++)
  25. {
  26. tree[i].parent=i;
  27. tree[i].relation=;
  28. }
  29. }
  30. int find(int x) //查找父亲并更新自己与父亲节点的关系
  31. {
  32. int temp;
  33. if(tree[x].parent!=x)
  34. {
  35. temp=tree[x].parent;
  36. tree[x].parent=find(tree[x].parent);
  37. tree[x].relation=(tree[x].relation+tree[temp].relation)%;
  38. }
  39. return tree[x].parent;
  40. }
  41. void Merge(int x,int y,int px,int py,int d) //父亲不同的时候,把后一个当成自己的父亲并更新关系;
  42. {
  43. tree[py].parent=px;
  44. tree[py].relation=((-tree[y].relation)+(d-)+tree[x].relation)%; //理解不了,就先记清;
  45. }
  46. int main()
  47. {
  48. int i,j;
  49. int px,x,y,py,d,ans;
  50. scanf("%d %d",&n,&k);
  51. begin();
  52. ans=;
  53. for(i=; i<=k; i++)
  54. {
  55. scanf("%d %d %d",&d,&x,&y);
  56. if(x>n || y>n || (d== && x==y) ) //如果超过了范围,或者自己把自己给吃了;
  57. ans++;
  58. else
  59. {
  60. px=find(x);py=find(y);
  61. if ( px != py ) //父亲不同的时候,把后一个当成自己的父亲并更新关系;
  62. Merge(x,y,px,py,d);
  63. else
  64. { // 父亲相同,两个人的关系不同,ans++;
  65. if(d== && tree[x].relation != tree[y].relation)
  66. ans++;
  67. if (d== && (tree[y].relation + -tree[x].relation)% != ) //算法公式,要弄明白,不明白的话,先记着;
  68. ans++;
  69. }
  70. }
  71.  
  72. } cout<<ans<<endl;
  73. return ;
  74. }

poj 1182 食物链 并查集的又一个用法的更多相关文章

  1. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  2. poj 1182 食物链 并查集 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...

  3. POJ 1182 食物链(并查集的使用)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 81915   Accepted: 24462 Description ...

  4. POJ 1182食物链(并查集)

    食物链Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 85474 Accepted: 25549Description动物王国中有三 ...

  5. POJ - 1182 食物链 并查集经典

    思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...

  6. poj——1182食物链 并查集(提升版)

    因为是中文题,题意就不说了,直接说思路: 我们不知道给的说法中的动物属于A B C哪一类,所以我们可以用不同区间的数字表示这几类动物,这并不影响结果,我们可以用并查集把属于一类的动物放在一块,举个例子 ...

  7. POJ 1182 食物链 (并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50601   Accepted: 14786 Description ...

  8. POJ 1182 食物链(并查集)

    题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...

  9. poj 1182 (关系并查集) 食物链

    题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...

随机推荐

  1. iOS中 三种随机数方法详解

    ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(t ...

  2. OpenShift应用镜像构建(3) - Jenkins的流水线构建

    Jenkins方式构建的定位是使用专门的CICD平台. 既支持把JenKins作为一个Pod部署到openshift内部,也支持部署在Openshift集群外部,操作上的区别是 openshift自己 ...

  3. Kubernetes下的Redis主从配置架构

    文章看了一大堆,但都是直接从各种地方直接拉master,slave镜像,没有交代这些镜像如何构建出来的 好把,我这篇就讲讲这些master,slave镜像如何做成. 先得找到一个标准的redis镜像, ...

  4. Android-Universal-Image-Loader载入图片

    直接看代码:MainActivity: package com.example.textwsjdemo; import com.nostra13.universalimageloader.cache. ...

  5. MySQL建表时,日期时间类型选择

    MySQL(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  D ...

  6. ylbtech-LanguageSamples-Delegates(委托)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Delegates(委托) 1.A,示例(Sample) 返回顶部 “委托”示例 本示例 ...

  7. window进入本地组策略编辑器和计算机管理界面

    win+R 进入运行窗口 输入gpedit.msc 进入本地组策略编辑器, 右键我的电脑,点击管理 进入计算机管理界面

  8. Node.js m03122图片批量下载爬虫1.00

    //====================================================== // m03122图片批量下载爬虫1.00 // 2017年11月18日 //==== ...

  9. 病毒木马查杀实战第015篇:U盘病毒之脱壳研究

    前言 因为我们的终于目标是编写出针对于这次的U盘病毒的专杀工具.而通过上次的分析我们知道,病毒有可能在不同的计算机中会以不同的名称进行显示.假设真是如此,那么就有必要在此分析出病毒的命名规律等特征,然 ...

  10. Bootstrap-学习系列

    前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中,只有前两篇关于Bootstrap的文章发表在了博客园的首页 ...