poj 1182 食物链(种类并查集 ‘初心者’)
题目链接:http://poj.org/problem?id=1182
借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的。
题意就不解释了,中问题。
关于种类并查集结局方法也是挺多的
1扩增倍数。
就是有几种关系就建立几倍数组,具体方法在这里不详细说了,这种方法有弊端
比较复杂而且内存消耗比较大如果关系比较多就容易爆掉。
2向量的方法。
这种方法要详细解说一下。这个方法好处都有啥.......(自行脑补后面的话)
这个方法的优点占用内存比较小而且比较简洁。只要找到关系就行。
下面就用方法2来说一下这道题目
这题总共有3种关系
1)同类。2)A eat B。3)B eat A。
所以就设root[i],等于1表示同类,等于2表示关系2,等于3表示关系3
初始化是将root的值全定义为0表示他们毫不相关,然后再慢慢将关系加入进去
int find(int x) {
if(x == f[x])
return x;
int t = find(f[x]);
root[x] = (root[x] + root[f[x]]) % 3;//这个注意一下在寻找根节点的过程中要记得更新一下root的值。
f[x] = t;
return f[x];
}//寻找根节点
int a = find(x) , b = find(y);
if(d == 1) {
if(a == b) {
if(root[x] != root[y])//这个很好理解就不解释了
count++;
}
else {
f[a] = b;
root[a] = root[y] - root[x];//root[a]+root[x]=root[y] 这样就好理解了吧
root[a] = (root[a] + 3) % 3;
}
}
if(d == 2) {
if(a == b) {
if((root[x] + 1) % 3 != root[y])//这个也很好理解就是A->B or B->C or C->A他们的root关系就差1
count++;
}
else {
f[a] = b;
root[a] = root[y] - root[x] - 1;//root[a]+root[x] +1 = root[y];
root[a] = (root[a] + 3) % 3;
}
}
//这些都是关键代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 5e4 + 10;
int n , k , root[M] , f[M];
void init() {
for(int i = 1 ; i <= n ; i++) {
f[i] = i , root[i] = 0;
}
}
int find(int x) {
if(x == f[x])
return x;
int t = find(f[x]);
root[x] = (root[x] + root[f[x]]) % 3;
f[x] = t;
return f[x];
}
int main() {
int d , x , y;
scanf("%d%d" , &n , &k);
int count = 0;
init();
while(k--) {
scanf("%d%d%d" , &d , &x , &y);
if(x > n || y > n) {
count++;
continue;
}
int a = find(x) , b = find(y);
if(d == 1) {
if(a == b) {
if(root[x] != root[y])
count++;
}
else {
f[a] = b;
root[a] = root[y] - root[x];
root[a] = (root[a] + 3) % 3;
}
}
if(d == 2) {
if(a == b) {
if((root[x] + 1) % 3 != root[y])
count++;
}
else {
f[a] = b;
root[a] = root[y] - root[x] - 1;
root[a] = (root[a] + 3) % 3;
}
}
}
printf("%d\n" , count);
return 0;
}
poj 1182 食物链(种类并查集 ‘初心者’)的更多相关文章
- POJ 1182 食物链(种类并查集)
记得第一次做这道题的时候,推关系感觉有点复杂,而且写完代码后一直WA,始终找不出错误. 在A了十几道并查集后,再做这道题,发现太小儿科了.发现原来之所以WA,就在于查找根节点时,没有同步更新子节点相对 ...
- poj 1182 食物链 (并查集)
http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...
- POJ 1182 食物链(并查集拆点)
[题目链接] http://poj.org/problem?id=1182 [题目大意] 草原上有三种物种,分别为A,B,C A吃B,B吃C,C吃A. 1 x y表示x和y是同类,2 x y表示x吃y ...
- POJ 1182 食物链(并查集+偏移向量)题解
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82346 Accepted: 24616 Description ...
- POJ 1182 食物链 (并查集解法)(详细注释)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78510 Accepted: 23396 Description ...
- 【POJ 1182 食物链】并查集
此题按照<挑战程序设计竞赛(第2版)>P89的解法,不容易想到,但想清楚了代码还是比较直观的. 并查集模板(包含了记录高度的rank数组和查询时状态压缩) *; int par[MAX_N ...
- 食物链 POJ 1182(种类并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ 1182 食物链 【并查集】
解题思路:首先是没有思路的----然后看了几篇解题报告 http://blog.csdn.net/ditian1027/article/details/20804911 http://poj.org/ ...
- POJ 1182 食物链 经典并查集+关系向量简单介绍
题目: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有 ...
- poj 1182食物链(并查集)
算法思路:把那些确定了相对关系的节点放在同一棵树里(可以同时存在多棵树,单独每棵树中节点的相对关系确定),每个节点对应的 v[] 值记录他与根节点的关系( 0:同类: 1:根吃他: 2:他吃根 ).当 ...
随机推荐
- 【OpenCV-ANN神经网络自动驾驶】树莓派OpenCV神经网络自动驾驶小车【源码+实物】
没错!这个是我的毕业设计!!! 整个电子信息学院唯一一个优秀毕业设计 拿到这里炫耀了 实物如下: 电脑端显示效果: 自动驾驶实现过程: 1. 收集图像数据.建立局域网,让主机和Raspberry Pi ...
- oracle常用的一些sql命令
//查看系统当前时间 HH24 24小时制 MI是正确的分钟 select to_char(sysdate,'yyyy-mm-dd HH24:MI:SS') from dual //HH非24 ...
- 自练Eclipse搭建SSH全自动注解博客项目笔记
1.创建一个动态的java项目 2.导入搭建所需要的jar包 3.配置web.xml文件 1).头文件 2).struts2的拦截器 3).定位加载Spring容器的配置文件 4).监听 5). 6) ...
- JAVA面向对象面试题带答案(墙裂推荐)
1) 在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用(c)关键字来申明父类的这些方法. a) Finalc b) Static c) Abstract d) Void2 ...
- spring-boot-starter-quartz集群实践
[**前情提要**]由于项目需要,需要一个定时任务集群,故此有了这个spring-boot-starter-quartz集群的实践.springboot的版本为:2.1.6.RELEASE:quart ...
- Amazon S3
Amazon S3 是什么? Amazon S3 是亚马逊推出的一款存储服务,名为 Amazon Simple Storage Service,即亚马逊简单存储服务. 有些 S3 的概念需要了解一下: ...
- 对Java中HashCode方法的深入思考
前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...
- [转载]关于ActiveMQ集群
转载于 http://blog.csdn.net/nimmy/article/details/6247289 近日因工作关系,在研究JMS,使用ActiveMQ作为提供者,考虑到消息的重要,拟采用Ac ...
- JavaWeb——使用会话维持状态3
这次的例子是使用会话给上一个例子添加登陆功能 1.页面逻辑 首先是登陆页面,这里需要输入账号和密码,输入正确后将进入商品列表页面,输入错误将会提示账号或者密码错误 其次是商品列表和购物车页面,添加了注 ...
- 十款强大的IDEA插件-Java开发者的利器
xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 插 ...