poj1182(带权并查集)
题目链接:http://poj.org/problem?id=1182
题意:题目告诉有 3 种动物,互相吃与被吃,现在告诉你 m 句话,其中有真有假,叫你判断假的个数 ( 如果前面没有与当前话冲突的,即认为其为真话 )。每句话开始都有三个数 D A B,当D = 1时,表示A 和B是同类,当D = 2时表示A 吃 B。
思路:
想了好久也没有思路,数据量这么大,感觉只能用并查集来完成,之后参考了巨巨的博客:https://www.cnblogs.com/liuxin13/p/4668205.html。
不禁赞叹,真的是好题啊。好了,这道题是一个带权并查集的题。对于每一句话,首先可能出现直接能判定为假的情况,即输入的数有大于n的或者D=2且A=B时。之后就需要并查集了。不访设A->B的关系中0表示同类、1表示A吃B、2表示A被B吃。则输入的D减一后即代表A->B表示的关系,现在就将需要把有关系的点并在一起,用root[i]表示点i的祖先,f[i]表示点i与其祖先的关系,可能为0,1,2。
接下来先推一个公式:
这样题目就可以继续进行了。输入d a b,用ra,rb表示a,b的祖先。若能直接判断为假话,则++res,继续下一句话,否则:
1.ra!=rb:那么将a,b合并。路径:root[rb]=ra。关系:f[rb]=rb->ra=(rb->a+a->ra)%3=((6-a->b-b->rb)%3+a->ra)%3=(6-a->b-b->rb+a->ra)%3=(6-(d-1)+f[a]-f[b])%3。
2.ra==rb:查询a->b是否等于(d-1)。判断f[a]==((d-1)+f[b])%3是否成立,若不成立则为错话。
在getr函数中要路径压缩和权值压缩(看代码,由上面推的公式就明白了)。
详见代码:
#include<cstdio>
using namespace std; int n,k,res,d,a,b;
int root[],f[]; int getr(int kk){
if(root[kk]==kk) return kk;
else{
int tmp=root[kk];
root[kk]=getr(root[kk]);
f[kk]=(f[kk]+f[tmp])%;
return root[kk];
}
} int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i)
root[i]=i,f[i]=;
while(k--){
scanf("%d%d%d",&d,&a,&b);
int ra=getr(a),rb=getr(b);
if(a>n||b>n||(d==&&a==b))
++res;
else if(ra==rb){
if(f[a]!=(d-+f[b])%)
++res;
}
else{
root[rb]=ra;
f[rb]=(-(d-)+f[a]-f[b])%;
}
}
printf("%d\n",res);
return ;
}
poj1182(带权并查集)的更多相关文章
- poj1182 带权并查集
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 60225 Accepted: 17656 Description ...
- 种类并查集——带权并查集——POJ1182;HDU3038
POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...
- poj1182 食物链(带权并查集)
题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...
- 【带权并查集】poj1182 食物链
带权并查集,或者叫做种类并查集,经典题. http://blog.csdn.net/shuangde800/article/details/7974668 这份代码感觉是坠吼的. 我的代码是暴力分类讨 ...
- 【POJ1182】 食物链 (带权并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- 带权并查集 poj1182
首先要注意核心代码 int find(int i){ if(i == fa[i]) return fa[i]; int tt = find(fa[i]); num[i] ...
- poj1182食物链,经典带权并查集
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ...
- Poj1182 食物链(并查集/带权并查集)
题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...
- poj1182 食物链 带权并查集
题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...
随机推荐
- DOM操作之获取HTML、文本和值
在前面的知识中,我们有提到一个text()方法用来获取文本,其实,在jQuery中,获取HTML和文本的方法有很多,下面依次演示这些方法. 在开始操作前,我们先在html中添加如下代码,后期所有的操作 ...
- 杂项:Mantis
ylbtech-杂项:Mantis 缺陷管理平台Mantis,也做MantisBT,全称Mantis Bug Tracker.Mantis是一个基于PHP技术的轻量级的开源缺陷跟踪系统,以Web操作的 ...
- 17monipdb.dat
17monipdb是一款全球ipv4地址归属地数据库.专注于与地理位置定位相关的数据的整理与发行,致力于将地理位置数据变得更准确.更精确,该 IP 库主要基于 BGP/ASN 数据以及遍布全球的网络监 ...
- 学习URL地址(待整理)
编程开发教程:http://www.runoob.com/ ElasticSearch教程:https://es.xiaoleilu.com/index.html 设计模式:http://www.cn ...
- smb.conf详解[未完]
看着玩意看的吐血!!!! baidu\google充斥着一堆错误的文章及翻译,samba.org上动辄就是this document is old and might be incurrent. 不过 ...
- 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?
作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- java impl
java impl 是一个资源包,用来存放java文件的.在Java开发中,通常将后台分成几层,常见的是三层mvc:model.view.controller,模型视图控制层三层,而impl通常处于c ...
- sql上下级关系查询
有一张存在上下级关系的function表,parentId表示上级Id,现要查询出上级菜单下的子菜单,每个子菜单显示成以逗号分隔的字符串 表结构如下: create table menu ( id i ...
- Python - Django - 使用 Pycharm 连接 MySQL 数据库
在 Pycharm 的右上方找到 Database 点击 依次点击,选择 MySQL 数据库 点击 Download 下载驱动文件 下载完成后对数据库的相关信息进行填写 填写完成后点击“Test Co ...
- tensorboard-sklearn数据-loss
记录sklearn数据训练时的loss值,用tensorboard可视化 三步骤:红字处 import tensorflow as tf from sklearn.datasets import lo ...