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