食物链(Food Chain POJ 1182)
题述
有N只动物,分别编号为1,2,…,N-1。所有动物都属于A,B,C中的一种。已知A吃B、B吃C、C吃A。按顺序给出下面的两种信息共K条。
第一种:x和y属于同一种类。
第二种:x吃y。
然而这些信息有可能会出错。有可能有的信息和之前给出的信息矛盾,也有的信息可能给出的x和y不在1,2,…,N的范围内。求在K条信息中有多少条是不正确的。计算过程中,我们将忽视诸如此类的错误信息。
限制条件
1<=N<=50000
0<=K<=100000
样例
输入
100 7( N K)
1 101 1(T[i] X[i] Y[i])
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
输出
3
题记
我们并不需要知道每个动物是那种,只需要找矛盾,后面的只要跟前面的矛盾,后面的就是错的。对于每只动物i创建出来3个元素i-A,i-B,i-C,并用这3*N个元素建立并查集。这个并查集维护如下信息:
i-x表示i属于种类x
并查集里的每一组表示组内所有元素代表的情况都同时发生或不发生
例如,如果i-A和j-B在同一个组里,就表示如果i属于种类A那么一定就有j属于B,如果j属于种类B那么就一定有i属于种类A。因此对于每一条信息,只需要按照下面进行操作就可以了
第一种,x和y属于同一种类 合并x-A,y-A、x-B,y-B、x-C、y-C
第二种,x吃y,合并x-A,y-B、x-B,y-C、x-C、y-A
代码如下
#include <iostream>
//食物链(并查集)
using namespace std;const int Maxn=50005;
const int MaxK=100005;int par[Maxn]; //父亲
int tree_rank[Maxn]; //树的高度//输入
int N,K;
int T[MaxK],X[MaxK],Y[MaxK]; //T是信息类型//初始化n个元素
void init(int n){for(int i=0;i<n;i++){par[i]=i;tree_rank[i]=0;}
}//查询树的根
int find(int x){if(par[x]==x)return x;elsereturn par[x]=find(par[x]); //查询过程中经过的所有点都改为直接连到根上
}//合并x和y所属的集合
void unite(int x,int y){x=find(x);y=find(y);if(x==y)return;if(tree_rank[x]<tree_rank[y]){par[x]=y;}else{par[y]=x;if(tree_rank[x]==tree_rank[y])tree_rank[x]++;}}//判断x和y是否属于同一个集合
bool same(int x,int y){return find(x)==find(y);
}void solve(){//初始化并查集//元素x,x+N,x+2*N分别表示x-A,x-B,x-Cinit(3*N);int ans=0;for(int i=0;i<K;i++){int t=T[i];int x=X[i]-1,y=Y[i]-1; //把输入变成0,1,2,...,N-1//不正确的编号if(x<0||N<=x||y<0||N<=y){ans++;continue;}if(t==1){//x和y属于同一类if(same(x,y+N)||same(x,y+2*N))ans++;else{unite(x,y);unite(x+N,y+N);unite(x+2*N,y+2*N);}}else{//x吃yif(same(x,y)||same(x,y+2*N))ans++;else{unite(x,y+N);unite(x+N,y+2*N);unite(x+2*N,y);}}}printf("%d\n",ans);
}int main()
{scanf("%d %d",&N,&K);for(int i=0;i<K;i++)scanf("%d %d %d",&T[i],&X[i],&Y[i]);solve();return 0;
}
食物链(Food Chain POJ 1182)相关推荐
- C - 食物链 POJ - 1182
C - 食物链 POJ - 1182 大佬,%%% 加入给你一个 1, 那 1 应该放进 A.B.还是C呢,不知道了,所以开三倍的空间, 1~n 表示 A, n+1~2n 表示 B, 2n+1 ~ 3 ...
- 食物链 poj 1182
C - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ 1182 食物链,并查集的拓展
http://poj.org/problem?id=1182 /******************************************************** 此道题目 前天看的时候 ...
- poj 1182 食物链 并查集
转自一位大佬的最全题解 https://blog.csdn.net/c0de4fun/article/details/7318642 #include <cstdio> #include ...
- 【poj 1182】食物链 并查集应用
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 59239 Accepted: 17332 Description 动物王 ...
- 食物链 POJ - 1182(带权并查集模板)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ...
- 【POJ - 1182】 食物链(附超详细讲解)(并查集--种类并查集经典题)
题干: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. ...
- poj 1182 食物链 (并查集)
http://poj.org/problem?id=1182 重点依旧是用rank记录相对于根节点的关系,并及时跟新rank的值. code: #include<cstdio> using ...
最新文章
- 【SRIO】2、RapidIO串行物理层的包与控制符号
- spinner 下拉框控件
- 简析Instgram的搜索架构
- 基于Prometheus和Grafana打造业务监控看板
- 如何将网页部署到maven_如何通过Rultor将Maven工件部署到CloudRepo
- vue2实践揭秘pdf_《Vue2实践揭秘》源码
- google地图 离线版 经纬度_一款钓鱼人专用的卫星地图,野钓找水库找钓点找进水口不是梦。...
- CAMoE——屠榜 video retrieval challenge
- C# 封装的功能强大的中国农历日历操作类的代码
- Each interface on the back of the fuselage
- 短视频就这样玩丢了底线
- Cornerstone 4 for Mac(SVN管理工具)
- 精彩Linux 篇章
- [GIS原理] 8.2 空间分析-邻近度分析-Delaunay三角网(德劳内)/泰森多边形(Thiessen多边形)/冯洛诺伊图(Voronoi图)
- 超详细的装饰器Decorators解读--附实例
- Dockerhub最新的toomanyrequests问题
- 【辅助驾驶】Python在Windows系统下实现TTS(文字转语音)
- 转载:stm32的引脚有两种用途
- 测试分析与测试用例设计方法
- Python将两个列表合并成一个列表