这是一个非常经典的带权并查集,有两种写法。

1 边权并查集

规定一下,当x和y这条边的权值为0时,表示x和y是同类,当为1时,表示x吃y,当为2时,表示x被y吃。

一共有三种状态,如图,当A吃B,B吃C时,C必须吃A,路径压缩后,A被C吃。

然后就是带权并查集的模板了。

判断条件,当x和y在同一颗树上是,

如果说,x和y之间的关系是0,那么x和RA与Y和RA之间的关系必须相同才行。x和Y之间的关系是1,当S[y]=2时,S[x]=1,当s[y]=1时,s[x]应等于0,才能满足

所以判断条件为(s[x]-s[y]+3)%3=relation.

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+;
int fa[N];
int sum[N];
int find(int x){
if(fa[x]==x) return x;
else {
int c=find(fa[x]);
sum[x]=(sum[x]+sum[fa[x]]+)%;
return fa[x]=c;
}
}
bool unite(int x,int y,int z){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
fa[fx]=fy;
sum[fx]=(sum[y]-sum[x]+z+)%;
return ;
}
else if((sum[x]-sum[y]+)%==z) return ;
else return ;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
fa[i]=i;
sum[i]=;
}
int ans=;
int d,x,y;
for(int i=;i<=m;i++){
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(d==&&x==y)) {
ans++;
continue ;
}
if(unite(x,y,d-)) ans++;
}
printf("%d\n",ans);
return ;
}

2 种类并查集:

思路:将每一个元素拆成3份,x,x+n,x+2*n。分别表示A,B,C

如果x和y为同类,那么x不能和y+n一组,x不能和y+2*n一组。

如果x吃y的话,那么x不能和y一组,x不能呢y+2*n一组。

code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+;
int pre[N+N+N]; int find(int x){
return pre[x]==x? x:pre[x]=find(pre[x]);
}
void unite(int a,int b){
int x=find(a),y=find(b);
pre[x]=y;
} bool same(int x,int y){
return find(x)==find(y);
} int main(){
int n,m;
cin>>n>>m;
for(int i=;i<=n+n+n;i++) pre[i]=i;
int ans=;
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
y--;z--;
if(y>=n||z>=n||y<||z<){
ans++;continue ;
}
if(x==){
if(same(y,z+n)||same(y,z+*n)) ans++;
else {
unite(y,z);unite(y+n,z+n);unite(y+*n,z+*n);
}
}
else {//如果y吃z的话
if(same(y,z)||same(y,z+*n)) ans++;
else {
unite(y,z+n);unite(y+n,z+*n);unite(y+*n,z);
}
}
}
cout<<ans<<endl;
return ;
}

食物链 POJ - 1182 (并查集的两种写法)的更多相关文章

  1. POJ 1182 并查集

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

  2. POJ1703 && POJ2942 &&POJ 1182 并查集 这个做法挺巧妙

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37242   Accepted: ...

  3. poj 1182 并查集高级应用

    C - 是谁站在食物链的顶端 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     ...

  4. DisJSet:食物链(POJ 1182)

           动物王国的食物链 这一题有两种思路,先介绍第一种: 题目是中文的,我就不翻译了,也很好理解,就是一个A-B-C-A的一个循环的食物链,给定一些条件,问你哪些条件是错的 这一题,是一道比较 ...

  5. NOI2001 食物链【扩展域并查集】*

    NOI2001 食物链 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

  6. poj 1984 并查集

    题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...

  7. EF架构~linq模拟left join的两种写法,性能差之千里!

    回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...

  8. 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。

    比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...

  9. Sql语句模糊查询字符串的两种写法

    Sql语句模糊查询有两种写法,一种是在jdbcTemplate的查询方法参数里拼接字符串%,一种是在Sql语句里拼接%字符串. public class IsNameDaoImpl implement ...

随机推荐

  1. Selenium系列(五) - 键盘操作详细解读

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  2. hdu2838 cow sorting用树状数组求逆序对

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2838/ 题目解法:题目给出一个1-n的排列,操作只有一种:交换相邻的元素,代价是两个元素之和,问将该序列变成升序 ...

  3. 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪

    6-PACK: Category-level 6D Pose Tracker with Anchor-Based Keypoints 论文地址: 6-PACK: Category-level 6D P ...

  4. 洛谷 P5639 【CSGRound2】守序者的尊严 题解

    原题链接 简要题意: 从 \(1\) 号位开始走,可以连续走过一段连续的 \(0\) ,每走一次,所有位置取反. (即 \(0 \gets 1\),\(1 \gets 0\)). 算法一 模拟暴力即可 ...

  5. CF1324D Pair of Topics 题解

    原题链接 简要题意: 有两个数组 \(a_i\),\(b_i\),求有多少组 \(a_i + a_j > b_i + b_j (i \not = j)\). 显然,纯暴力过不了这道题目. 首先, ...

  6. 感知器基础原理及python实现

    简单版本,按照李航的<统计学习方法>的思路编写 数据采用了著名的sklearn自带的iries数据,最优化求解采用了SGD算法. 预处理增加了标准化操作. ''' perceptron c ...

  7. docker下centos7编译安装ffmpeg

    1.安装基础命令 docker下精简版centos没有make等命令,先安装: yum -y install gcc automake autoconf libtool make yum instal ...

  8. Synchronized锁机制和ReentrantLock

    Synchronized Java中的每个对象都可以作为锁. 普通同步方法,锁是当前实例对象. 静态同步方法,锁是当前类的class对象. 同步代码块,锁是括号中的对象. 锁的内部机制 一般锁有4种状 ...

  9. Chart控件的使用

    1.开启滚动条(ScaleView.Size除以Interval ,大概是中间出现纵线的数量,一般动ScaleView.Size) chart1.ChartAreas[0].CursorX.AutoS ...

  10. 《深入理解 Java 虚拟机》读书笔记:线程安全与锁优化

    正文 一.线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那 ...