食物链 POJ - 1182 (并查集的两种写法)
这是一个非常经典的带权并查集,有两种写法。
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 (并查集的两种写法)的更多相关文章
- POJ 1182 并查集
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ1703 && POJ2942 &&POJ 1182 并查集 这个做法挺巧妙
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37242 Accepted: ...
- poj 1182 并查集高级应用
C - 是谁站在食物链的顶端 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:10000KB ...
- DisJSet:食物链(POJ 1182)
动物王国的食物链 这一题有两种思路,先介绍第一种: 题目是中文的,我就不翻译了,也很好理解,就是一个A-B-C-A的一个循环的食物链,给定一些条件,问你哪些条件是错的 这一题,是一道比较 ...
- NOI2001 食物链【扩展域并查集】*
NOI2001 食物链 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...
- poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...
- EF架构~linq模拟left join的两种写法,性能差之千里!
回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...
- 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。
比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...
- Sql语句模糊查询字符串的两种写法
Sql语句模糊查询有两种写法,一种是在jdbcTemplate的查询方法参数里拼接字符串%,一种是在Sql语句里拼接%字符串. public class IsNameDaoImpl implement ...
随机推荐
- golang工具之present - 编写go特色的ppt
简介: Golang Present 是 Golang 社群开发出來的一个简单工具,通过简单的语法可以制作 ppt(语法近似于 Markdown). 默认文件格式是 .slide ,是随着 gol ...
- tpyboard v202 测试tcp通讯,i2c的oled程序,呼吸灯源码,希望对大家有所帮助
1.下载到板子里的main.py代码如果需要驱动oled的,可以参考我上面那篇文章import time, mathimport machineimport network# from ssd1306 ...
- macOS 去掉系统软件更新红点提示
当前系统提示更新到macOS Catalina .打开终端执行以下命令: 第一步运行: sudo softwareupdate --ignore "macOS Catalina" ...
- 一夜搞懂 | JVM 类加载机制
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑Java的类加载机制,这是Java的一个很重要的创 ...
- 有个原则就是实体类还是controller入参都应该是 包装类型
问题说明 我在使用JPA作为项目的ORM框架的时候,在分页查询中,不管咋样使用查询不出来数据,然后发现Hibernate构建的查询SQL中,在where子句中带上了createTime=0这个条件.这 ...
- Go语言库系列之email
导读 大家好我是平也,今天跟大家介绍一款用来发送邮件的Go语言库email,目前星星1.3k,非常好用. 极速上手 准备工作 初始化项目 go get github.com/jordan-wright ...
- 实验十三 MySQL多用户事务管理
实验十三 MySQL多用户事务管理 一. 实验内容: 1. 事务机制的使用 2. 锁机制的使用 二. 实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为YGGL中,YGGL数据库中 ...
- NKOJ3772 看电影
问题描述 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l<=r<= ...
- 汇编学习-三(VB)
闲来无事做了一下160个crackme,因为是VB程序,所以将得到的一点心得记录如下(OD加载注释) push eax ; Andréna.004018A8 call dword ptr ds:[&l ...
- DevOps技能自查表
前篇提到了DevOps的工作岗位要求,但是没有来的及深入细节,本文根据个人10年多的经验,尽量详细地列举DevOps所需要用到的一些技术和相关参考网站. Linux基础 Linux系统的基本概念: 必 ...