题目链接: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 食物链(种类并查集 ‘初心者’)的更多相关文章

  1. POJ 1182 食物链(种类并查集)

    记得第一次做这道题的时候,推关系感觉有点复杂,而且写完代码后一直WA,始终找不出错误. 在A了十几道并查集后,再做这道题,发现太小儿科了.发现原来之所以WA,就在于查找根节点时,没有同步更新子节点相对 ...

  2. poj 1182 食物链 (并查集)

    http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...

  3. 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 ...

  4. POJ 1182 食物链(并查集+偏移向量)题解

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 82346   Accepted: 24616 Description ...

  5. POJ 1182 食物链 (并查集解法)(详细注释)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 78510   Accepted: 23396 Description ...

  6. 【POJ 1182 食物链】并查集

    此题按照<挑战程序设计竞赛(第2版)>P89的解法,不容易想到,但想清楚了代码还是比较直观的. 并查集模板(包含了记录高度的rank数组和查询时状态压缩) *; int par[MAX_N ...

  7. 食物链 POJ 1182(种类并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  8. POJ 1182 食物链 【并查集】

    解题思路:首先是没有思路的----然后看了几篇解题报告 http://blog.csdn.net/ditian1027/article/details/20804911 http://poj.org/ ...

  9. POJ 1182 食物链 经典并查集+关系向量简单介绍

    题目: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有 ...

  10. poj 1182食物链(并查集)

    算法思路:把那些确定了相对关系的节点放在同一棵树里(可以同时存在多棵树,单独每棵树中节点的相对关系确定),每个节点对应的 v[] 值记录他与根节点的关系( 0:同类: 1:根吃他: 2:他吃根 ).当 ...

随机推荐

  1. Ubuntu下python安装mysqldb(驱动)

    最近在学习Django框架,需要使用到数据库,我使用的是mysql,跟java一样,需要安装驱动,这是驱动的下载网址http://sourceforge.net/projects/mysql-pyth ...

  2. l命令练习题1

    1.创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) [root@localhost ~]# mkdir -p /guanli/zonghe | mk ...

  3. Fragment 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  4. win系统上Anaconda国内镜像配置

    清华镜像2019.6.15已恢复 中科大镜像2019.7.1停机维护后恢复 1.打开anaconda prompt 2.添加清华镜像1:https://mirrors.tuna.tsinghua.ed ...

  5. shardingjdbc 强制路由走主库查询实时数据 避免主从同步数据延迟

    @Beanpublic shardingsphere.demo.entity.Order order(){ shardingsphere.demo.entity.Order order=new Ord ...

  6. 【Java例题】3.6 计算arcsin(x)的值

    6.使用泰勒展开式计算arcsin(x)的值. arcsin(x)=x+x^3/(2*3)+1*3*x^5/(2*4*5)+...+ (2n)!*x^(2n+1)/(2^2n)*(n!)^2*(2n+ ...

  7. .Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)

    前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容.但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事.程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当 ...

  8. react学习(一)--JSX简介

    由于在中国银联实习的项目要用到react,所以不得不硬着头皮把react学习一下.这是要往全栈发展吗0.0 正文: 一个最简单的React例子如下, ReactDOM.render( <h1&g ...

  9. 低版本IE兼容 H5+CSS3 方案

    [主要是针对ie6 7 8对支持和让老浏览器支持html5+css3的一些js脚本] html5shiv.js  // 让IE8及耕地版本的IE识别section,article,nav等html5元 ...

  10. Java——字符串

    1.不可变的String String对象是不可变的.String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改修改后的字符串内容. public ...