并查集

首先先要读懂题目,a是b的食物的话,b的天敌是a,b的食物是a的天敌

比如,人吃鸡,鸡吃草,那么草吃人。。。。。

所以建3个并查集,+n时表示这是其食物,+2*n时表示这是其天敌

所以当x,y是同类当且仅当x的食物不是y,且x的天敌不是y

当x吃y当且仅当x和y不是同类,y的食物不是x

然后并查集维护即可

#include <bits/stdc++.h>
using namespace std;
const int MAXN=51000;
int n,k,fa[MAXN*4],ans;//1 same 2 food 3 enemy
inline int find(int x)
{
if (fa[x]==x)
return fa[x];
fa[x]=find(fa[x]);
return fa[x];
}
void unite(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
fa[fx]=fy;
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=3*n+10;i++)
fa[i]=i;
for (int i=1;i<=k;i++)
{
int d,x,y;
scanf("%d%d%d",&d,&x,&y);
if (x>n ||y>n)
{
ans++;
continue;
}
if (d==1)
{
if (find(x+n)==find(y) || find(x+n*2)==find(y))
{
ans++;
continue;
}
unite(x,y);
unite(x+n,y+n);
unite(x+2*n,y+2*n);//三个并查集的同类都要连起来
}
else
{
if (x==y || find(x)==find(y) || find(x+2*n)==find(y))
{
ans++;
continue;
}
unite(x+n,y);
unite(x+2*n,y+n);
unite(x,y+2*n);//三个并查集维护
}
}
printf("%d\n",ans);
}

最新文章

  1. Maven个人手册
  2. 35.两链表的第一个公共结点[Find the first common node of two linked list]
  3. java中常见的几种Runtimeexception
  4. Laplacian算子
  5. Android Gradle 多Module单独编译一个Module
  6. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
  7. tomcat 启动时参数设置说明
  8. c++builder6.0 mdi窗体+自定义子窗体
  9. List Of All Machine Learning Sorted By Citation
  10. Palindrome Partitioning——LeetCode
  11. Js把URL中的参数解析为一个对象
  12. winform基础——实现简易赈灾物资发放登记系统
  13. android端向服务器提交请求的几种方式
  14. Chapter 1 First Sight——31
  15. 使用可以为 null 的类型
  16. SpringBoot2.0之六 多环境配置
  17. 百度地图DEMO-路线导航,测距,标点
  18. 脚本检测Kafka和Zookeeper
  19. webpack2配置备份
  20. javascript篇-浅拷贝与深拷贝

热门文章

  1. P5322 排兵布阵解题报告
  2. SSIS 生成文件
  3. 利用 JS 脚本实现网页全自动秒杀抢购
  4. 本地vue项目跨域服务器接口
  5. thinkphp5 chunk 分块处理数据小坑
  6. linux块设备驱动---概念与框架(转)
  7. 用ip xfrm搭ipsec隧道
  8. 多测师讲解python _re模块_高级讲师肖sir
  9. C 语言因为疫情重登最流行编程语言榜第一名!其实它一直都在~
  10. spring-boot-route(十八)spring-boot-adtuator监控应用