首先要注意核心代码

int find(int i){
    if(i == fa[i])
        return fa[i];
    int tt = find(fa[i]);
    num[i] = (num[i] + num[fa[i]]) % 3;
    fa[i] = tt;
    return fa[i];
}
不能写成

int find(int i){
    if(i == fa[i])
        return fa[i];
    fa[i] = find(fa[i]);
    num[i] = (num[i] + num[fa[i]]) % 3;
    //fa[i] = tt;
    return fa[i];
}

如果这样的话fa指的就不是他的father而是他的祖先算num的时候会发生错误

而后37,8行不能这样写

num[find(y)] = (num[x] + (3-a) + 3-num[y]) %3;//这是会造成最祖先不是0  接下来find是会错误
  fa[find(y)]  = fx;

由这件事我们知道做带权并查集时要是可保证最祖先权值为零,预处理出所有要求的最祖先也是一个好习惯。

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int maxa = ;
int fa[maxa];
int num[maxa];
int find(int i){
if(i == fa[i])
return fa[i];
int tt = find(fa[i]);
num[i] = (num[i] + num[fa[i]]) % ;
fa[i] = tt;
return fa[i];
} int main(){
//freopen("in.cpp", "r", stdin);
int n, m;
int x, y, a;
scanf("%d%d", &n, &m);
int sum = ;
for(int i = ; i <= n; i++)
fa[i] = i, num[i] = ;
for(int i = ; i <= m; i++){
scanf("%d%d%d", &a, &x, &y);
//printf("%d %d %d\n", a, x, y);
if(x > n || y > n )//||(x == y && a == 2) )
sum ++;
else{
a --;
int fx = find(x), fy = find(y);
if(fx == fy){
if((num[x] - num[y] + ) % != a)
sum ++;//,printf("%d %d %d %d\n",x, y, find(x), find(y));
}else{
num[fy] = (num[x] + (-a) + -num[y]) %;
fa[fy] = fx;
//printf("%d %d %d %d %d\n",x, y, num[x], num[y], sum);
}
}
}
printf("%d\n", sum); }

带权并查集 poj1182的更多相关文章

  1. 种类并查集——带权并查集——POJ1182;HDU3038

    POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...

  2. 并查集例题02.带权并查集(poj1182)

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

  3. poj1182 食物链(带权并查集)

    题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...

  4. 【带权并查集】poj1182 食物链

    带权并查集,或者叫做种类并查集,经典题. http://blog.csdn.net/shuangde800/article/details/7974668 这份代码感觉是坠吼的. 我的代码是暴力分类讨 ...

  5. 【POJ1182】 食物链 (带权并查集)

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

  6. poj1182食物链,经典带权并查集

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

  7. poj1182(带权并查集)

    题目链接:http://poj.org/problem?id=1182 题意:题目告诉有  3  种动物,互相吃与被吃,现在告诉你  m  句话,其中有真有假,叫你判断假的个数  (  如果前面没有与 ...

  8. Poj1182 食物链(并查集/带权并查集)

    题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...

  9. poj1182 食物链 带权并查集

    题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...

随机推荐

  1. 一些 CSS 框架

    利用 CSS 框架,可以简化你的工作,提高工作效率.CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块.下面给你推荐了27款优秀的CSS框 ...

  2. 【Linux】 任务调度/计划 cron

    实时查看日志: tail -f /var/log/cron 显示任务调度 bash#crontab -u username -l 编辑 bash#crontab -u username -e 内容: ...

  3. JQUERY1.9学习笔记 之基本过滤器(二) 等于选择器

    等于选择器 :eq() 描述:选择与设定下标匹配的元素.jQuery( ":eq(index)" )jQuery( ":eq(-index)" ) <!D ...

  4. IE的有条件注释详解

    IE的有条件注释是一种专有的(因此是非标准的).对常规(X)HTML注释的Miscrosoft扩展.顾名思义,有条件注释使你能够根据条件(比如浏览器版本)显示代码块.尽管是非标准的,但是有条件注释对于 ...

  5. xml代码

    修改和删除: <?php$doc=new DOMDocument();$doc->load("php.xml");$root=$doc->documentElem ...

  6. SQLite3简单入门及C++ API

    转载请注明出处:http://www.cnblogs.com/StartoverX/p/4660487.html 项目用到SQLite3,简单记录一下. MySQL不同,SQLite3的数据库基于文件 ...

  7. Linux_cloudera-scm-agent: unrecognized service

  8. RMAN-06023: no backup or copy of datafile 6 found to restore

    一:问题描述 我用指定备份集恢复时,报错: RMAN> run { 2> shutdown immediate; 3> startup mount; 4> allocate c ...

  9. 电磁兼容性设计学习笔记--PCB中地的布局

    http://bbs.ednchina.com/BLOG_ARTICLE_3010439.HTM PCB上元器件的布局对整个PCB板的电磁兼容性影响很大,所以从事硬件电路设计的工程师很有必要学习PCB ...

  10. 51单片机模拟I2C总线的C语言实现

    电路原理图   EEPROM为ATMEL公司的AT24C01A.单片机为ATMEL公司的AT89C51. 软件说明 C语言为Franklin C V3.2.将源程序另存为testi2c.c,用命令 C ...