洛谷 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 ...
随机推荐
- Django【第11篇】:Django之分页升级版本(组件)
分页组件 一.分页的实现与使用 class Pagination(object): """ 自定义分页 """ def __init__(s ...
- [转帖]ssh 远程执行命令
ssh 远程执行命令 https://www.cnblogs.com/youngerger/p/9104144.html SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是 ...
- 【NOIP2016提高A组8.12】奇袭
题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试--魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量 ...
- js解决手机键盘影响定位的问题
// 滑动其他地方隐藏软键盘document.body.addEventListener('touchend', function(evt) { document.activeElement.blur ...
- JS onclick中this用法
当在dom元素中使用onclick绑定事件的时候,可以使用this来指向该元素对象. 打印输出的内容为: 所以可以通过该this对象来获取子元素 //通过element获取该对象下的一个audio标签 ...
- warp(图像仿射变换)
仿射变换是一种二维坐标(x,y)到二维坐标(u,v)的线性变换. 对应的齐次坐标矩阵表示形式为: 仿射变换特点: 直线经仿射变换后依然为直线: ’直线之间的相对位置关系保持不变,平行线经仿射变换后依然 ...
- RabbitMQ绑定、队列、消息、虚拟主机详解(五)
Binding:绑定,Exchange和Exchange.Queue之间的连接关系 Binding中可以包含RoutingKey或者参数 Queue:消息队列,实际存储消息数据 Durability: ...
- es之词库热更新解决方案
1. 下载tomcat,作为远程词库的容器 , 需要在tomcat中配置词库 /webapp/ROOT这个路径下新建一个远程词库:Vim hot.dicHot.dic中存放的就是实时热词 2.测试t ...
- [CSP-S模拟测试]:方程的解(小学奥数)
题目描述 给出一个二元一次方程$ax+by=c$,其中$x$.$y$是未知数,求它的正整数解的数量. 输入格式 第一行一个整数$T$,表示有$T$组数据.接下来$T$行,每行$3$个整数$a$.$b$ ...
- 如何将一个SpringBoot简便地打成一个war包(亲测有效)
正常情况下SpringBoot项目是以jar包的形式,通过命令行: 来运行的,并且SpringBoot是内嵌Tomcat服务器,所以每次重新启动都是用的新的Tomcat服务器.正因如此,也出现了一个问 ...