老司机的奇幻漂流 UESTC - 1594

Problem Description

老司机在救出了女票之后,就和她在全世界旅游,有一天,他们来到了一个神奇的小岛上。

这个小岛上有三种动物,他们互相克制,就像虚空追猎凤凰石头剪刀布一样,他们形成了一个食物环。

热爱小动物的老司机女票已经对这个岛上的N只动物进行了细致的研究,对他们所属的族群也了如指掌,并对他们的行为做了记录。

第一种记录方式是1 X Y,表示X和Y关系密切(是同类)。

第二种记录方式是2 X Y,表示X对Y有攻击性行为(X克制Y)。

不过很不凑巧,这些记录被毛手毛脚的JJ给打乱了,使得其中一些记录出现了错误。

为了安慰着急的女票,老司机急忙来帮忙查看是哪些记录出现了错误,当一条记录满足以下三种可能之一时,这就是一条错误的记录。

1)这条记录中的X或者Y比N大

2)攻击性记录中的X攻击了X

3)这条记录与前面的记录相悖

老司机说是来帮忙,但是还要忙着跑去和wyy踢fifa,所以就让你来完成这个任务,找出这些记录中哪些错了。

Input

第一行两个整数N和M,为记录的动物数量和记录条数

接下来M行,每行代表一条记录。

Output

一行n个数字,表示哪几条记录有误,用空格隔开

按编号升序输出

Sample Input

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

Sample Output

1 4 5

Hint

数据范围:

1<= N <= 50,000

1<= M <=100,000


  1. 这是一个食物链问题的并查集,算是并查集中比较高端的问题了,这里有一个很好的博客,想了解的可以去看看食物链并查集,其实在看了这个博客之后还不是很懂,但是模板大概是个什么样子还是知道了。这里面有一个很核心的公式:rootx->rooty = (relation[x]+d-1+3-relation[y])%3 = relation[rooty]

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5+100;
  4. struct node
  5. {
  6. int pre;
  7. int relation;
  8. } p[maxn];
  9. int find(int x)
  10. {
  11. int temp;
  12. if(x == p[x].pre)
  13. return x;
  14. temp = p[x].pre;
  15. p[x].pre = find(temp);
  16. p[x].relation = (p[x].relation + p[temp].relation)%3;
  17. return p[x].pre;
  18. }
  19. int main()
  20. {
  21. int n,m;
  22. while(cin>>n>>m)
  23. {
  24. queue <int> qu;
  25. for(int i=1; i<=n; i++)
  26. {
  27. p[i].pre = i;
  28. p[i].relation = 0;
  29. }
  30. for(int i=1; i<=m; i++)
  31. {
  32. int a,b,c;
  33. cin>>c>>a>>b;
  34. if(a == b && c == 2)
  35. {
  36. qu.push(i);
  37. continue;
  38. }
  39. if(a > n || b > n)
  40. {
  41. qu.push(i);
  42. continue;
  43. }
  44. int fa = find(a);
  45. int fb = find(b);
  46. if(fa != fb)
  47. {
  48. p[fb].pre = fa;
  49. p[fb].relation = (3 + (c - 1) + p[a].relation - p[b].relation)%3;//很重要的合并公式
  50. //rootx->rooty = (relation[x]+d-1+3-relation[y])%3 = relation[rooty](公式)
  51. }
  52. else
  53. {
  54. if(c == 1 && p[a].relation != p[b].relation)//同类但是和父类的关系不同是不可能的
  55. qu.push(i);
  56. if(c == 2 && ((3 - p[a].relation + p[b].relation)%3 != c -1))//检验是否是符合捕食关系
  57. qu.push(i);
  58. }
  59. }
  60. if(qu.empty())
  61. continue;
  62. printf("%d",qu.front());
  63. qu.pop();
  64. while(!qu.empty())
  65. {
  66. printf(" %d",qu.front());
  67. qu.pop();
  68. }
  69. }
  70. return 0;
  71. }

并查集:CDOJ1594-老司机的奇幻漂流 (食物链)的更多相关文章

  1. 并查集:CDOJ1593-老司机破阵 (假的并查集拆除)

    老司机破阵 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Problem Descri ...

  2. 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster

    前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...

  3. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  4. 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)

    ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...

  5. LA 3644 易爆物 并查集

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  6. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  7. 老司机的奇怪noip模拟T2-huangyueying

    2. 黄月英(huangyueying.cpp/c/pas )[问题描述]xpp 每天研究天文学研究哲学,对于人生又有一些我们完全无法理解的思考.在某天无聊学术之后, xpp 打开了 http://w ...

  8. 老司机实战Windows Server Docker:2 docker化现有iis应用的正确姿势

    前言 上一篇老司机实战Windows Server Docker:1 初体验之各种填坑介绍了安装docker服务过程中的一些小坑.这一篇,我们来填一些稍大一些的坑:如何docker化一个现有的iis应 ...

  9. 老司机带你开飞机 一: mssql on linux 安装指导

    通常在本机开发环境中需要搭建所有的服务,还要修改本地的hosts,实在是不胜其烦.如今有了docker,完全不用污染本地环境,且看老司机带你搭建一个asp.net core的开发环境集群.愿你走出虚拟 ...

随机推荐

  1. 1550: Simple String 最大流解法

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久以前做的一题,当时队友用最大流做,现在我也是 这个转化为二分图多重匹配,就是一样的意 ...

  2. (转)通过MySQL复制线程SQL_Thread加快增量恢复binlog

    数据回档常常是使用全量备份+binlog增量实现的.而数据量很大的情况下,增量恢复binlog一直是一个苦恼的问题,因为恢复binlog速度十分慢,并且容易出错. 恢复binlog文件一般有两种方法: ...

  3. IO流----File,递归,字节流,字符流

    要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上. 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读 ...

  4. vuejs 学习旅程一

    来上海快一年了,一直在东钿金融工作着,这一年来主要负责公司前期的房产评估微信平台,公司IT部也是刚刚成立,成立IT部门不仅仅只是维护房产评估微信,而是要做一个互金理财平台.于是我一年来的主要工作是负责 ...

  5. Kendo MVVM 数据绑定(二) Checked

    Kendo MVVM 数据绑定(二) Checked Checked 绑定用在 checkbox ()或 radio button ()上.注意: checked 绑定只适用于支持 checked 的 ...

  6. Windows下Python多版本共存

    Windows下Python多版本共存 Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas) 0.0 因为公司项目,需要Python两个 ...

  7. specrate 与specspeed 的区别

    What is the difference between a "rate" and a "speed" metric?There are several d ...

  8. 运行JavaWeb项目报错Access denied for user 'root'@'localhost' (using password: YES)

    问题重现:(以下讨论范围仅限Windows环境): C:\AppServ\MySQL> mysql -u root -p Enter password: ERROR 1045 (28000):  ...

  9. SPOJ BALNUM Balanced Numbers 平衡数(数位DP,状压)

    题意: 平衡树定义为“一个整数的某个数位若是奇数,则该奇数必定出现偶数次:偶数位则必须出现奇数次”,比如 222,数位为偶数2,共出现3次,是奇数次,所以合法.给一个区间[L,R],问有多少个平衡数? ...

  10. mininet安装,使用

    http://mininet.org/download/ http://sdnhub.cn/index.php/mininet-walkthrough-chinese/ --------------- ...