【带权并查集】poj1182 食物链
带权并查集,或者叫做种类并查集,经典题。
http://blog.csdn.net/shuangde800/article/details/7974668
这份代码感觉是坠吼的。
我的代码是暴力分类讨论的,没有用取模的写法,取模的写法更简洁,证明要用到同余的知识,通用性不高,具体可以看上面那份代码。
就并查集每个结点记录与其父节点的关系,并且在路径压缩,以及集合合并的时候进行讨论。
代码风格在程设老师的教育下进行了改变,的确感觉比高中那种代码风格要好点。
#include<cstdio>
using namespace std;
int fa[50010],rel[50010];
int n,m,ans;
int findroot(int x){
if(x==fa[x]){
return x;
}
int Fa=findroot(fa[x]);
if(rel[x]==0 && rel[fa[x]]==0){
rel[x]=0;
}
else if(rel[x]==0 && rel[fa[x]]==1){
rel[x]=1;
}
else if(rel[x]==0 && rel[fa[x]]==2){
rel[x]=2;
}
else if(rel[x]==1 && rel[fa[x]]==0){
rel[x]=1;
}
else if(rel[x]==1 && rel[fa[x]]==1){
rel[x]=2;
}
else if(rel[x]==1 && rel[fa[x]]==2){
rel[x]=0;
}
else if(rel[x]==2 && rel[fa[x]]==0){
rel[x]=2;
}
else if(rel[x]==2 && rel[fa[x]]==1){
rel[x]=0;
}
else if(rel[x]==2 && rel[fa[x]]==2){
rel[x]=1;
}
return fa[x]=Fa;
}
int main(){
// freopen("poj1182.in","r",stdin);
int op,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
fa[i]=i;
}
for(int i=1;i<=m;++i){
scanf("%d%d%d",&op,&x,&y);
if(x>n || y>n || (op==2 && x==y)){
++ans;
continue;
}
int f1=findroot(x),f2=findroot(y);
if(f1==f2){
if(op==1){
if(rel[x]!=rel[y]){
++ans;
}
}
else{
if(rel[x]==0 && rel[y]!=2){
++ans;
}
else if(rel[x]==1 && rel[y]!=0){
++ans;
}
else if(rel[x]==2 && rel[y]!=1){
++ans;
}
}
}
else{
fa[f1]=f2;
if(op==1){
if(rel[x]==0 && rel[y]==0){
rel[f1]=0;
}
else if(rel[x]==0 && rel[y]==1){
rel[f1]=1;
}
else if(rel[x]==0 && rel[y]==2){
rel[f1]=2;
}
else if(rel[x]==1 && rel[y]==0){
rel[f1]=2;
}
else if(rel[x]==1 && rel[y]==1){
rel[f1]=0;
}
else if(rel[x]==1 && rel[y]==2){
rel[f1]=1;
}
else if(rel[x]==2 && rel[y]==0){
rel[f1]=1;
}
else if(rel[x]==2 && rel[y]==1){
rel[f1]=2;
}
else if(rel[x]==2 && rel[y]==2){
rel[f1]=0;
}
}
else{
if(rel[x]==0 && rel[y]==0){
rel[f1]=1;
}
else if(rel[x]==0 && rel[y]==1){
rel[f1]=2;
}
else if(rel[x]==0 && rel[y]==2){
rel[f1]=0;
}
else if(rel[x]==1 && rel[y]==0){
rel[f1]=0;
}
else if(rel[x]==1 && rel[y]==1){
rel[f1]=1;
}
else if(rel[x]==1 && rel[y]==2){
rel[f1]=2;
}
else if(rel[x]==2 && rel[y]==0){
rel[f1]=2;
}
else if(rel[x]==2 && rel[y]==1){
rel[f1]=0;
}
else if(rel[x]==2 && rel[y]==2){
rel[f1]=1;
}
}
}
}
printf("%d\n",ans);
return 0;
}
【带权并查集】poj1182 食物链的更多相关文章
- 种类并查集——带权并查集——POJ1182;HDU3038
POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...
- 并查集例题02.带权并查集(poj1182)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...
- 带权并查集 poj1182
首先要注意核心代码 int find(int i){ if(i == fa[i]) return fa[i]; int tt = find(fa[i]); num[i] ...
- 【POJ1182】 食物链 (带权并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- poj1182食物链,经典带权并查集
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ...
- poj1182 食物链(带权并查集)
题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...
- Poj1182 食物链(并查集/带权并查集)
题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...
- poj1182 食物链 带权并查集
题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...
- POJ 1182 食物链 【带权并查集】
<题目链接> 题目大意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我 ...
随机推荐
- bzoj 1202 并查集
首先我们知道若干区间和信息,判断给出信息是否合法,可以用并查集维护,我们用dis[x]表示x到father[x]的距离为多少,即区间father[x]到x的长度,这样我们可以在路径压缩的时候维护dis ...
- zuul进行rate limit
maven <dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>sp ...
- 浅析MongoDB用户管理
浅析MongoDB用户管理 http://www.jb51.net/article/53830.htm mongodb3.03开启认证 http://21jhf.iteye.com/blog/2216 ...
- Keepalived 安装与简单配置
Keepalived 安装与简单配置 http://sivxy.lofter.com/post/1d21ebb9_7e15000
- Python——turtle生成图片保存
代码示例如下: from Tkinter import * from turtle import * import turtle forward(100) ts = turtle.getscreen( ...
- HDU-1083
Courses Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- prerender.io 搜索引擎优化 部署成windows服务 实现开机自动开启服务
一 prerender.io服务端部署 参考官方网站的部署步骤: $ git clone https://github.com/prerender/prerender.git $ cd preren ...
- gulp在webstorm里运行,告别cmd控制台!
使用webstorm运行gulp程序,不再用一直开着cmd了!鬼知道自己会不会不小心关闭了cmd呢.看截图操作吧! 如果你的gulp设置了default任务,那么直接点击“运行‘default‘’就行 ...
- H264与AAC ES打包成MP4
注意 设置图像的sps pps MP4AddH264SequenceParameterSet(file,video,sps,sizeof(sps)); MP4AddH264PictureParamet ...
- macos不能打开windows samba共享问题(转载)
转自:https://www.macx.cn/thread-2095377-1-1.html?mod=viewthread&tid=2095377&extra=page%253D1&a ...