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

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. 初探elasticsearch

    目录 安装elasticsearch elasticsearch中的层级结构与关系型数据库的对比 elasticsearch的分布式特性 集群和节点 为java用户提供的两种内置客户端 节点客户端(n ...

  2. Hive数据倾斜的原因及主要解决方法

    数据倾斜产生的原因 数据倾斜的原因很大部分是join倾斜和聚合倾斜两大类 Hive倾斜之group by聚合倾斜 原因: 分组的维度过少,每个维度的值过多,导致处理某值的reduce耗时很久: 对一些 ...

  3. Python批量修改文件名模板

    源码如下:import os import re import sys filePath = r'F:\BaiduNetdiskDownload\COVID-19CTSeg\3DUNet-Pytorc ...

  4. SpringBoot学习笔记(十一:使用MongoDB存储文件 )

    @ 目录 一.MongoDB存储文件 1.MongoDB存储小文件 2.MongoDB存储大文件 2.1.GridFS存储原理 2.2.GridFS使用 2.2.1.使用shell命令 2.2.2.使 ...

  5. Python数据库之数据库基本操作

    安装(基于centos) yum -y install mariadb mariadb-server # centos7版本 yum -y install mysql mysql-server #ce ...

  6. 四、【Docker笔记】Docker容器

    容器是Docker的另一个核心概念,容器就是镜像的一个运行实例,只是它具有一个可写的文件层,而镜像是一个只读的文件. 一.创建容器 1.新建容器 我们可以使用 docker create 命令来创建一 ...

  7. javascript实现组合列表框中元素移动效果

    应用背景:在页面中有两个列表框,需要把其中一个列表框的元素移动到另一个列表框 .  实现的基本思想: (1)编写init方法对两个列表框进行初始化: (2)为body添加onload事件调用init方 ...

  8. NKOJ3768 数列操作

    问题描述 给出N个正整数数列a[1..N],再给出一个正整数k,现在可以重复进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次 ...

  9. F - 我们什么时候能见面? POJ - 2028

    F - 我们什么时候能见面? POJ - 2028 ICPC委员会希望尽快召开会议,解决下一届比赛中的每一个小问题.然而,委员会的成员都忙于疯狂地开发(可能是无用的)程序,以至于很难安排他们的会议日程 ...

  10. P1130 红牌(动态规划)

    P1130 红牌 思路如下 这一题很像数字金字塔,我们可以正着求最小时间,当然也可以逆着求最小时间, 如果正着求:那么我们怎么求状态转移方程呢?,在这里我们假定状态转移方程为:dp[ i ][ j ] ...