【NOI 2001】食物链(种类并查集)
传送门
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】食物链(种类并查集)相关推荐
- POJ1182 食物链 —— 种类并查集
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- 食物链 (种类并查集)
文章目录 食物链 思路 AC代码 食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号. ...
- POJ1182 食物链---(经典种类并查集)
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- 食物链(种类并查集)
一般我们的并查集是可以维护这样的关系的,比如亲戚的亲戚是亲戚,只需要简单调用并查集就可以实现.但如果我们现在想要维护一个这样的关系,比如敌人的敌人是朋友,那一般的并查集就不行了,对于一般的并查集而言, ...
- Bailian1182 POJ1182 食物链【并查集】
1182:食物链 描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)
题干: Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36176 Accep ...
- 【C语言】算法学习·种类并查集
一般的并查集,维护的是具有连通性.传递性的关系,例如亲戚的亲戚是亲戚.但是,有时候,我们要维护另一种关系:敌人的敌人是朋友.种类并查集就是为了解决这个问题而诞生的. 我们先来看一个例题: 其实很容易想 ...
- Poj(1703),种类并查集
题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- poj 1703(种类并查集)
题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解 ...
最新文章
- 利用递归、迭代解决斐波那契数列问题与汉诺塔难题
- i3wm amxier toggle只关闭不开启问题解决
- Tenka1 Programmer Contest C - Align
- ML 03、机器学习的三要素
- 4.Hadoop的学习(Hadoop的安装及环境变量的配置)
- docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
- 数字图像处理总结(冈萨雷斯版)
- php带参数跳转页面,如何带参数跳转php界面_后端开发
- php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
- 剑指 Offer II 083. 没有重复元素集合的全排列
- python中lambda的另类使用
- 语音识别之wave文件(*.wav)格式、PCM数据格式介绍
- remix Web3 provider连接不上探究
- PIX for Windows使用
- 学计算机课业压力,关于学习负担、学业负担及课业负担的一段解释
- Apache Ignite详解
- 10 ,对称矩阵,对角矩阵,相似矩阵,对角化 :
- postman测试接口成功,实际发请求时失败
- RSA加密(3.0)
- ASCII码表及含义
热门文章
- Guava - Collections - Immutable collections
- 解决Myeclipse中断点不起作用的方法
- VS 2010 安装 .net framework2.0/3.0/3.5
- Java实现FastDFS文件上传、查询、下载和删除
- 消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)
- 加密方式(包括MD5 base64 对称加密 非对称加密简介)
- JAVA8——StringJoiner类
- compose yaml规则
- 什么软件可以让头发变黑_头发特别干枯毛躁,请问什么方法可以让头发恢复到顺滑状态?...
- docker(podman)命令参考