传送门

Solution:

并查集,维护种类。

father维护可追溯的根节点,num维护与根节点的关系,我们定义0表示x与根节点同类,1表示x吃根节点,2表示根节点吃x。

当getfather(X)==(Y)

若D==1,而num[X]!=num[Y], 则此话为假。(D==1 表示X与Y为同类,而从num[X]!=num[Y]可以推出 X 与 Y 不同类.矛盾.)

若D==2

当num[X]=num[Y] 矛盾 则此话为假

此外

当num[X]=0&&num[Y]=2是对的
当num[X]=1&&num[Y]=0是对的
当num[X]=2&&num[Y]=1是对的

这三句话 稍加观察就会发现num[X]=(num[Y]+1)%3;

当getfather(X)!=getfather(Y)

此时考虑更新
自己分析一下吧 不想写了qwq

Summarize:

对于这类种类并查集,我们需要分类仔细讨论,归纳出更一般的判断方法。

#include<iostream>
#include<cstdio>
#define N 50005
using namespace std;
int n,k,father[N],num[N],ans;//0->x和y同类 1->x吃y 2->y吃x(y代表x的祖先)
int getfather(int x)
{if(father[x]==x)    return x;int fa=father[x];father[x]=getfather(father[x]);num[x]=(num[fa]+num[x])%3;return father[x];
}
int main()
{ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);cin>>n>>k;for(int i=1;i<=n;i++){father[i]=i;num[i]=0; }for(int i=1;i<=k;i++){int d,x,y;cin>>d>>x>>y;if(x>n||y>n){ans++;continue;}if(d==2&&x==y){ans++;continue;}int ax=getfather(x);int bx=getfather(y);if(d==1){if(ax==bx&&num[x]!=num[y]){   ans++;continue;}else if(ax!=bx){father[ax]=bx;num[ax]=(3+num[y]-num[x])%3;}}if(d==2){if(ax==bx){if(!(num[x]==(num[y]+1)%3)){ans++;continue;}}else{father[ax]=bx;num[ax]=(3+num[y]-num[x]+1)%3;}}}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/Patrickpwq/articles/9395173.html

【NOI 2001】食物链(种类并查集)相关推荐

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

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

  2. 食物链 (种类并查集)

    文章目录 食物链 思路 AC代码 食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号. ...

  3. POJ1182 食物链---(经典种类并查集)

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

  4. 食物链(种类并查集)

    一般我们的并查集是可以维护这样的关系的,比如亲戚的亲戚是亲戚,只需要简单调用并查集就可以实现.但如果我们现在想要维护一个这样的关系,比如敌人的敌人是朋友,那一般的并查集就不行了,对于一般的并查集而言, ...

  5. Bailian1182 POJ1182 食物链【并查集】

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

  6. 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)

    题干: Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36176   Accep ...

  7. 【C语言】算法学习·种类并查集

    一般的并查集,维护的是具有连通性.传递性的关系,例如亲戚的亲戚是亲戚.但是,有时候,我们要维护另一种关系:敌人的敌人是朋友.种类并查集就是为了解决这个问题而诞生的. 我们先来看一个例题: 其实很容易想 ...

  8. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  9. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  10. poj 1703(种类并查集)

    题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解 ...

最新文章

  1. 利用递归、迭代解决斐波那契数列问题与汉诺塔难题
  2. i3wm amxier toggle只关闭不开启问题解决
  3. Tenka1 Programmer Contest C - Align
  4. ML 03、机器学习的三要素
  5. 4.Hadoop的学习(Hadoop的安装及环境变量的配置)
  6. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
  7. 数字图像处理总结(冈萨雷斯版)
  8. php带参数跳转页面,如何带参数跳转php界面_后端开发
  9. php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
  10. 剑指 Offer II 083. 没有重复元素集合的全排列
  11. python中lambda的另类使用
  12. 语音识别之wave文件(*.wav)格式、PCM数据格式介绍
  13. remix Web3 provider连接不上探究
  14. PIX for Windows使用
  15. 学计算机课业压力,关于学习负担、学业负担及课业负担的一段解释
  16. Apache Ignite详解
  17. 10 ,对称矩阵,对角矩阵,相似矩阵,对角化 :
  18. postman测试接口成功,实际发请求时失败
  19. RSA加密(3.0)
  20. ASCII码表及含义

热门文章

  1. Guava - Collections - Immutable collections
  2. 解决Myeclipse中断点不起作用的方法
  3. VS 2010 安装 .net framework2.0/3.0/3.5
  4. Java实现FastDFS文件上传、查询、下载和删除
  5. 消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)
  6. 加密方式(包括MD5 base64 对称加密 非对称加密简介)
  7. JAVA8——StringJoiner类
  8. compose yaml规则
  9. 什么软件可以让头发变黑_头发特别干枯毛躁,请问什么方法可以让头发恢复到顺滑状态?...
  10. docker(podman)命令参考