洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)
传送门
解题思路
加权并查集:
什么是加权并查集?
就是记录着每个节点到它的父亲的信息(权值等)。
难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值
怎么转化呢?
每道题都不一样QAQ
看一看这道题我们用r[x]=0表示是x和f[x]是同种生物,等于1表示x吃f[x],等于2表示x是f[x]的食物。
从x点到f[x]的权值更新为i点到祖宗的权值的方法:
由于路径压缩是递归实现,所以其实返回f[x]=find(f[x])时,f[f[x]]就是祖宗。
所以其实就是这样一张图:

然后放到这个题上,不难发现r[x]=(r[x]+r[f[x]])%3。
大胆猜想,无需证明!!
然后就是合并:
先放图吧!F1是A的祖宗,F2是B的祖宗。

把A和B合并起来(A的祖宗的父亲定为B的祖宗)本质上就是求r[f1]。
而x是知道了的——当A和B是同类时,x就是0,当A吃B时,x就是1。
所以很显然,r[f1]=(r[b]+x-r[a]+3)%3。(因为有可能出现负数,所以+3后再%3)
大胆猜想,无需证明!!
种类并查集:
对于种类并查集不了解的可以下看一下这道较为简单的题——团伙。
了解了种类并查集后,再来看看这道题:用三个并查集分别维护同类,食物,天敌(把f数组开三倍大小——1~n,n+1~2*n,n*2+1~3*n)。
对于每一次数据——
- 当1时:判断如果a的天敌是b或b的天敌是a就ans++,否则就合并(a的同类就是b的同类,a的食物就是b的食物,a的天敌就是b的天敌)
- 当2时:判断如果a和b同种或a的天敌是b就ans++,否则就合并(a的食物是b,a的同类是b的天敌,a的天敌是b的食物)
最后输出答案即可。
//写起来比较简单,思考简单,无挑战难度——by ckw
AC代码
加权并查集:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=;
int n,k,f[maxn],r[maxn],ans;
int find(int x){
if(f[x]==x) return x;
int fa=find(f[x]);
r[x]=(r[x]+r[f[x]])%;
f[x]=fa;
return fa;
}
int main()
{
cin>>n>>k;
for(int i=;i<=n;i++){
f[i]=i;
}
while(k--){
int a,b,c;
scanf("%d%d%d",&c,&a,&b);
if((c==&&a==b)||a>n||b>n){
ans++;
continue;
}
int fx=find(a);
int fy=find(b);
if(c==){
if(fx==fy&&r[a]!=r[b]){
ans++;
continue;
}
if(fx!=fy){
f[fx]=fy;
r[fx]=(+r[b]-r[a])%;
}
continue;
}
if(c==){
if(fx==fy&&(r[a]+-r[b])%!=){
ans++;
continue;
}
if(fx!=fy){
f[fx]=fy;
r[fx]=(+r[b]-r[a]+)%;
}
}
}
cout<<ans;
return ;
}
加权并查集
种类并查集(压行大法好):
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=;
int n,k,f[maxn*],ans;
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
cin>>n>>k;
for(int i=;i<=*n;i++){
f[i]=i;
}
while(k--){
int a,b,c;
scanf("%d%d%d",&c,&a,&b);
if(a>n||b>n){ans++;continue;}
if(c==) (find(a+n)==find(b)||find(b+n)==find(a))?(ans++):(f[find(a)]=find(b),f[find(a+n)]=find(b+n),f[find(a+n*)]=find(b+n*));
else (a==b||find(a)==find(b)||find(a)==find(b+n))?(ans++):(f[find(a)]=find(b+*n),f[find(a+n)]=find(b),f[find(a+*n)]=find(b+n));
}
cout<<ans;
return ;
}
种类并查集
//NOI2001 Day1 t1
洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)的更多相关文章
- 洛谷 P2024 [NOI2001]食物链 解题报告
P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...
- 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护
先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...
- 洛谷 P2024 [NOI2001]食物链 (并查集)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...
- 洛谷 P2024 [NOI2001]食物链
题意简述 有人用两种说法对这 N 个动物所构成的食物链关系进行描述: 1."1 X Y",表示 X 和 Y 是同类. 2."2 X Y",表示 X 吃 Y . ...
- Java实现 洛谷 P2024 [NOI2001]食物链
输入输出样例 输入 #1 100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5 输出 #1 3 import java.util.Scanner; pub ...
- P2024 [NOI2001]食物链(种类并查集)
题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...
- [洛谷P2024/POJ1182]食物链 - 带偏移量的并查集(2)
Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...
- 种族并查集模板题分析 -----P2024 [NOI2001]食物链
本文参考了:洛谷p2024题解 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都 ...
- 【题解】P2024 [NOI2001]食物链 - 数据结构 - 并查集
P2024 [NOI2001]食物链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 动物王国中有三类动物 \(A,B ...
随机推荐
- “jps”命令的用处?
jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号. jps相当于Solaris进程工具ps.不像”pgrep java” 或”ps -ef grep java”,jp ...
- IDEA开发初始化设置
一.基本设置 1. 自动生成 serialVersionUID 的设置 2. 设置文件注释 3. 隐藏项目文件(夹) .git;.gitignore;.idea;.idea/.;.mvn;mvnw;m ...
- python如何导入自定义文件和模块$PYTHONHOME$\Lib\site-packages 方法
python 中如何引用自己创建的源文件(*.py)呢? 也就是所谓的模块. 假如,你有一个自定义的源文件,文件名:saySomething.py .里面有个函数,函数名:sayHello.如下图: ...
- Vue中 axios+QS 插件往后台传参
之前用Vue+element写了一个后台管理系统,在登录时使用axios请求数据传参时无法正常的获取数据.发现原因是传递参数要将参数序列化.这里使用了qs插件: 简单来说,qs 是一个增加了一些安全性 ...
- Linux内核设计与实现 总结笔记(第十三章)虚拟文件系统
一.通用文件系统接口 Linux通过虚拟文件系统,使得用户可以直接使用open().read().write()访问文件系统,这种协作性和泛型存取成为可能. 不管文件系统是什么,也不管文件系统位于何种 ...
- 【bzoj1179】[Apio2009]Atm
*题目描述: *输入: 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来 ...
- Leetcode 2. Add Two Numbers(指针和new的使用)结构体指针
---恢复内容开始--- You are given two non-empty linked lists representing two non-negative integers. The di ...
- 11年Macbook Air 安装win10 经验
11年macbook air安装win10折腾了好久,安装成功经验记录下. 1.使用BootCamp v6.0.6133 2.启动时U盘里面有两个引导Window和EFI,选择Windows启动.EF ...
- 洛谷P4317 花(fa)神的数论题(数位dp解法)
日常废话: 完了高一开学第二天作业就写不完了药丸(其实第一天就写不完了) 传传传传传送 显然爆搜肯定过不了这道题但是有60分 我们注意到在[1,n]中,有着相同的1的个数的数有很多.若有x个数有i个1 ...
- AOF — Redis 设计与实现
w AOF — Redis 设计与实现http://redisbook.readthedocs.io/en/latest/internal/aof.html