首先要注意核心代码

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. mysql时间int日期转换

    select from_unixtime(1350437720);select unix_timestamp(now());插入用 unix_timestamp(date)查询用from_unixti ...

  2. php设计模式 1单例模式

    之前很长时间之前就学习过设计模式,但是因为在实践中很少应用,所以忽略了,但现在却意识到设计模式很重要的,程序设计简介高效冗余性代码少. 今天开始把前几天学习的几个设计模式整理一下,首先当然是单例模式. ...

  3. NET Core驱动已出,支持EF Core

    NET Core驱动已出,支持EF Core 千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功 ...

  4. VMware虚拟机ping出现DUP!

    VMware虚拟机ping出现DUP!   ping 外网, 还是ping 网关都出现DUP! 百度查了许久,各种方法都无效,无奈只能google看老外的方法. http://codeblog.co. ...

  5. OSSEC配置

    http://gavinshaw.blog.51cto.com/385947/1020540

  6. BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 51  Solved: 4 ...

  7. Android中sharedPreference的简单使用

    public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super ...

  8. nutch和solr集成

    Linux下的Nutch和solr集成 3.1.Nutch安装 l 解压 tar -zxvf apache-nutch-1.4-bin.tar.gz l 终端下cd到目录  apache-nutch- ...

  9. zookeeper[1] (转)ZooKeeper Programmer's Guide(zookeeper编程向导)---中文

    原文:http://www.cnblogs.com/Xrinehart/p/3512509.html 本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实 ...

  10. mongodb的应用场景

    这篇文章总结的比较到位:http://www.tuicool.com/articles/YnmaAj