食物链
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 65534   Accepted: 19321

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

Source

 

本题的难点在于不是只有一类,而是有三类,找到一个维护这三个类的关系的方法就好做了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #define MAX_N 150000+5
  4.  
  5. using namespace std;
  6.  
  7. int par[MAX_N];//父节点
  8. int depth[MAX_N];//深度
  9.  
  10. void init(int n){
  11. for(int i=;i<=n;i++){
  12. par[i]=i;
  13. depth[i]=;
  14. }
  15. }
  16. int find_father(int t){
  17. if(t==par[t]){
  18. return t;
  19. }else{
  20. return par[t]=find_father(par[t]);
  21. //实现了路径压缩
  22. }
  23. }
  24. void unite(int t1,int t2){
  25. int f1=find_father(t1);
  26. int f2=find_father(t2);
  27. if(f1==f2){
  28. return ;
  29. }
  30. if(depth[f1]<depth[f2]){
  31. par[f1]=f2;
  32. }else{
  33. par[f2]=f1;
  34. if(depth[f1]==depth[f2]){
  35. depth[f1]++;
  36. //记录深度
  37. }
  38. }
  39. }
  40.  
  41. bool same(int x,int y){
  42. return find_father(x)==find_father(y);
  43. }
  44.  
  45. int main()
  46. {
  47. int n,k;
  48. int d,x,y;
  49. int ans=;
  50. scanf("%d %d",&n,&k);
  51. init(n*);
  52. for(int i=;i<k;i++){
  53. scanf("%d %d %d",&d,&x,&y);
  54. if(x<=||x>n||y<=||y>n||d==&&x==y){
  55. ans++;
  56. continue;
  57. }
  58. if(d==){
  59. if(same(x,y+n)||same(x,y+*n)){
  60. ans++;
  61. continue;
  62. }else{
  63. unite(x,y);
  64. unite(x+n,y+n);
  65. unite(x+*n,y+*n);
  66. }
  67. }else{
  68. if(same(x,y)||same(x,y+*n)){
  69. ans++;
  70. continue;
  71. }else{
  72. unite(x,y+n);
  73. unite(x+n,y+*n);
  74. unite(x+*n,y);
  75. }
  76. }
  77. }
  78. printf("%d",ans);
  79. return ;
  80. }

poj1182食物链_并查集_挑战程序设计竞赛例题的更多相关文章

  1. POJ 1182-食物链 [并查集] 《挑战程序设计竞赛》2.4

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

  2. POJ1182食物链(并查集经典好题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/E 题目思路:主要有两种思路:1.带权并查集2.挑战程 ...

  3. NOI2001|POJ1182食物链[种类并查集 向量]

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

  4. POJ1182 食物链(并查集)

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

  5. POJ-1182 食物链(并查集)

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

  6. POJ1182 食物链 【并查集变种】

    挺简单的 N个元素扩展为 3*N个 i-A i-B i-C A吃B吃C吃A 挑战程序设计的89面 #include <cstdio> #include <cstdlib> #i ...

  7. POJ1182食物链(并查集)

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

  8. poj1182 食物链(并查集 好题)

    https://vjudge.net/problem/POJ-1182 并查集经典题 对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类). 把两个元素放在一个组代表 ...

  9. poj1182 食物链【并查集-好题!】

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

  10. POJ1182 食物链 —— 种类并查集

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

随机推荐

  1. <转>打工与乘公交

    打工与乘公交 去一个公司打工就如同上了一辆公交车.在上车之前,你应该清楚自己打算去哪里,打算在哪里下车. 有的公交车很豪华,有的很破烂,但是这并不是重点,所有能开到目的地的车都是好车. 上了车之后,也 ...

  2. LeetCode:N-Queens I II(n皇后问题)

    N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...

  3. Json——js和C#对Json的操作

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式.博主记得几年前在华为外包项目中有一个和Android应用交互的需求,Andr ...

  4. SQLite剖析之数据类型

    许多SQL数据库引擎(除SQLite之外的各种SQL数据库引擎)使用静态.严格的数据类型.对于静态类型,一个值的数据类型由它的容器,即存储这个值的列来决定.SQLite则使用更加通用的动态类型系统.在 ...

  5. XStream简单入门

    简单的讲,XStream 涉及的就五个知识点:详情参考 官网 混叠,注解,转换器,对象流和操作json! 下面就用几个简单的例子来实现上述五个知识点! 基本步骤: 第1步:创建XStream对象. 通 ...

  6. iOS对键盘的处理

    方法1. 使用<UITextFeildDelegate>,使用的UITextField示例 设置其Delegate为self,点击return按钮隐藏键盘.实现函数如下:    - (BO ...

  7. CentOS 6.5安装在VMWare中Bridge模式下网卡eth0不能自动激活的问题

    VMWare 12.5.2 CentOS 6.5 basic VMWare网卡配置选择Bridge方式 问题: 默认情况下ifconfig命令只能看到网络设备lo,看不到eth0,也没有分配合理的IP ...

  8. Opencv 完美配置攻略(Win8.1 + Opencv 2.4.8 + VS 2013)

  9. [速记!vs调试技巧]

    当程序崩溃却又没有报错的时候,进入调试程序,断点处按Alt+7可以进入函数调用栈,甚至可以进入汇编栈,真的很有用,以后有时间学习汇编的话,估计这个功能会更加强大!

  10. <<< html图片背景平铺

    CSS背景图片平铺技巧 使用CSS来设置背景图片同传统的做法一样简单,但相对于传统控制方式,CSS提供了更多的可控选项,我们先来看看最基本的设置图片的方法.html代码: 代码如下: <divi ...