并查集:CDOJ1594-老司机的奇幻漂流 (食物链)
老司机的奇幻漂流 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
- 这是一个食物链问题的并查集,算是并查集中比较高端的问题了,这里有一个很好的博客,想了解的可以去看看食物链并查集,其实在看了这个博客之后还不是很懂,但是模板大概是个什么样子还是知道了。这里面有一个很核心的公式:rootx->rooty = (relation[x]+d-1+3-relation[y])%3 = relation[rooty]
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
struct node
{
int pre;
int relation;
} p[maxn];
int find(int x)
{
int temp;
if(x == p[x].pre)
return x;
temp = p[x].pre;
p[x].pre = find(temp);
p[x].relation = (p[x].relation + p[temp].relation)%3;
return p[x].pre;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
queue <int> qu;
for(int i=1; i<=n; i++)
{
p[i].pre = i;
p[i].relation = 0;
}
for(int i=1; i<=m; i++)
{
int a,b,c;
cin>>c>>a>>b;
if(a == b && c == 2)
{
qu.push(i);
continue;
}
if(a > n || b > n)
{
qu.push(i);
continue;
}
int fa = find(a);
int fb = find(b);
if(fa != fb)
{
p[fb].pre = fa;
p[fb].relation = (3 + (c - 1) + p[a].relation - p[b].relation)%3;//很重要的合并公式
//rootx->rooty = (relation[x]+d-1+3-relation[y])%3 = relation[rooty](公式)
}
else
{
if(c == 1 && p[a].relation != p[b].relation)//同类但是和父类的关系不同是不可能的
qu.push(i);
if(c == 2 && ((3 - p[a].relation + p[b].relation)%3 != c -1))//检验是否是符合捕食关系
qu.push(i);
}
}
if(qu.empty())
continue;
printf("%d",qu.front());
qu.pop();
while(!qu.empty())
{
printf(" %d",qu.front());
qu.pop();
}
}
return 0;
}
并查集:CDOJ1594-老司机的奇幻漂流 (食物链)的更多相关文章
- 并查集:CDOJ1593-老司机破阵 (假的并查集拆除)
老司机破阵 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Problem Descri ...
- 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster
前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...
- 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透
前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...
- 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)
ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...
- LA 3644 易爆物 并查集
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- 老司机的奇怪noip模拟T2-huangyueying
2. 黄月英(huangyueying.cpp/c/pas )[问题描述]xpp 每天研究天文学研究哲学,对于人生又有一些我们完全无法理解的思考.在某天无聊学术之后, xpp 打开了 http://w ...
- 老司机实战Windows Server Docker:2 docker化现有iis应用的正确姿势
前言 上一篇老司机实战Windows Server Docker:1 初体验之各种填坑介绍了安装docker服务过程中的一些小坑.这一篇,我们来填一些稍大一些的坑:如何docker化一个现有的iis应 ...
- 老司机带你开飞机 一: mssql on linux 安装指导
通常在本机开发环境中需要搭建所有的服务,还要修改本地的hosts,实在是不胜其烦.如今有了docker,完全不用污染本地环境,且看老司机带你搭建一个asp.net core的开发环境集群.愿你走出虚拟 ...
随机推荐
- kali linux安装搜狗输入法
1. 更新软件源 vi /etc/apt/sources.list 2. 安装fcitx apt-get install fcitx 3. 下载deb包到指定目录, dpkg -i sogou**** ...
- 获取jqGrid中选择的行的数据
下面可以获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id: var id=$(‘#gridTable’).jqGrid(‘getGridParam’,'selrow’); 如果想要 ...
- SyntaxHighlighter
SyntaxHighlighter uses separate syntax files called brushes to define its highlighting functionality ...
- Java并发(二):基础概念
并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方 ...
- Angular 路由route实例
iSun Design & Code AngularJS - 路由 routing 基础示例 AngularJS 路由 routing 能够从页面的一个视图跳转到另外一个视图,对单页面应用来讲 ...
- PADS 9.5封装向导 多一个管脚
使用PADS 9.5封装向导(Decal Wizard)建立封装(Decals) 时遇到封装的中间多了一个管脚,如图红圈位置,通过一番搜寻,才知道这是热焊盘,不需要就在右边的红圈处去掉勾选热焊盘即可.
- 安装cadence遇到vcredist.msi找不到问题
在新装的win7 64位系统上安装cadence遇到了如下问题,最后一个群里面的大哥帮了大忙,解决办法如下: 用windowsinstallercleanup 将KB2467175清理掉再装caden ...
- Android 虚拟导航挡住应用底部解决方案(屏幕底部的三个按键)
我在华为P6测试机上测试,发现底部的三个虚拟按钮遮挡了我的应用.类似效果如:https://www.zhihu.com/question/35292413#answer-28473700 解决方案 在 ...
- Jenkins系列——使用SonarQube进行代码质量检查
1.目标 之前已经写过一篇关于Jenkins和SonarQube的一篇博客<jenkins集成sonar>,本文在参考前文的基础上,做了详细的补充. 使用SonarQube进行代码质量检查 ...
- 快速搭建基于Azure Paas的高可用WordPress网站
产品详情 产品介绍 WordPress是一种使用非常广泛的CMS系统.本应用是根据Azure Resource Manager模板创建的.通过该ARM模板可以快速建立web应用和MySQL数据库,部署 ...