题目告诉有  3  种动物,互相吃与被吃,现在告诉你  m  句话,其中有真有假,叫你判断假的个数  (  如果前面没有与当前话冲突的,即认为其为真话  )。每句话开始都有三个数 D A B,当D = 1时,表示A 和B是同类,当D = 2时表示A 吃 B。

分析:既然要求假话,肯定是说的话跟以前说的存在矛盾,比如A->B,B->A,这样很明显第二句话是假话了,跟第一句话冲突,那么我们应该怎么去查询这种冲突呢,我们知道查询两个节点之间关系最快的方法就是并查集,只要把一些节点归为一个集合,查询起来是非常方便的,那么这道题是不是也可以这么做呢?答案是肯定的,不过我们除了要记录每个节点的根节点以外,还要记录与根节点的关系,

首先规定,生物之间的关系,0代表二者是同类,1代表A吃B,2代表A被B吃

说假话的条件:
1-   直接说假话,A或者B 的值大于动物的总数,(很明显是存在这种可能的,AB的取值范围大于动物总数),或者当D = 2, 时候 A == B,这也是一个睁眼说的假话,(这是同类相食,我们不允许这样的事情发生,所以这也是假话)。
2- 间接说假话,间接说假话就是跟以前说的话有冲突,我们先查找A和B的根节点为 ra 和 rb 如果ra == rb(根节点相同,说明二者属于同一个集合),如果 D = 1(同类),但是他们与根节点的关系不相同,或者D = 2,AB也会产生矛盾(看后面图)。不过问题来了,我们只知道他们俩关系,我们应该怎么判断他们俩之间的是否有矛盾?

大家看看这个是不是特别像什么东西??对了,就是向量,如果我们把这个转换成向量求是不是也可以呢???这是一个美好的想法,我们可以验证一下。
很明显A->C = (A->B+B->C) % 3
这也恰好是符合向量的运算,那么相同一棵树的节点间的关系就解决了。

当然我们最重要的问题还没有解决,就是合并和路径压缩,怎么把两个不同的集合合并成一个呢?我们前面讲过,合并两个集合只需要把他们的boss合并就可以了,所以我们可以先找出来他们的根节点ra 和 rb
我们想求出来 ra->rb ??
根据向量加法我们得出来
ra->rb = (ra->b+b->rb) % 3
rb->b = (a->b – a->ra + 3) % 3

合并一下两个公式得出来
ra->rb = (a->b - a->ra + 3 + b->rb) %3

有了这个关系我们就可以合并两个集合了,当然在做路径压缩的时候也不能忘了关系压缩。

#include<stdio.h>

const int maxn = 100005;

int f[maxn], r[maxn];

int Find(int x)
{
    int k = f[x];
    if(f[x] != x)
    {
        f[x] = Find(f[x]);
        r[x] = (r[k]+r[x])%3;
    }     return f[x];
} int main()
{
    int i, N, T, ans=0;     scanf("%d%d", &N, &T);     for(i=0; i<=N; i++)
    {
        f[i] = i;
        r[i] = 0;
    }     while(T--)
    {
        int x, y, d;         scanf("%d%d%d", &d, &x, &y);         int rx = Find(x), ry = Find(y);         if(x>N || y>N || (d==2&&x==y) )
            ans++;
        else if(rx == ry && (r[y]+d-1)%3 != r[x])
            ans++;
        else if(rx != ry)
        {
            f[rx] = ry;
            r[rx] = ((d-1)-r[x]+r[y]+3)%3;
        }
    }     printf("%d\n", ans);     return 0;
}

E - 食物链 poj1182的更多相关文章

  1. ACM/ICPC 之 并查集-食物链(POJ1182)

    并查集的经典题型,POJ上题目还是中文= =,一般看到中文题都会感觉不太简单,这道题的数学归纳用得比较多,可以简化代码,挺有意思的. 同类型的题目还有POJ1703,比这个要简单,想了解并查集基本介绍 ...

  2. 食物链--poj1182(并查集含有关系)

    http://poj.org/problem?id=1182   题意应该就不用说了  再次回到食物链这道题,自己写了一遍,一直wa...原因竟然是不能用多实例,我也是醉了,但是我真的彻底的理解了,那 ...

  3. 食物链(poj1182)

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

  4. (并查集 建立关系)食物链 -- POJ-- 1182

    链接: http://poj.org/problem?id=1182 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ...

  5. POJ-1182(经典带权并查集)

    食物链 POJ-1182 一个很好的分析博客:https://blog.csdn.net/niushuai666/article/details/6981689 三种关系:两者同类,吃父节点,被父节点 ...

  6. NOI2001|POJ1182食物链[种类并查集 向量]

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

  7. 并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)

    并查集专题训练地址,注册登录了才能看到题目 并查集是一个树形的数据结构,  可以用来处理集合的问题, 也可以用来维护动态连通性,或者元素之间关系的传递(关系必须具有传递性才能有并查集来维护,因为并查集 ...

  8. POJ1182 食物链---(经典种类并查集)

    题目链接:http://poj.org/problem?id=1182   食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  9. POJ-1182 食物链 并查集(互相关联的并查集写法)

    题目链接:https://cn.vjudge.net/problem/POJ-1182 题意 中文题目,就不写了哈哈 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃 ...

随机推荐

  1. 解决Undefined symbols for architecture x86_64: 报错 和 ld: warning: ld: warning: ignoring file警告

    出现这种错误的情况: 用iphone5模拟器编译程序正常, 用iphone5s以上的模拟器编译出现Undefined symbols for architecture x86_64: 报错 和 ld: ...

  2. 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法

    关键设置: 第一步(SQL2005.SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Serv ...

  3. javascript基础学习(二)

    javascript的数据类型 学习要点: typeof操作符 五种简单数据类型:Undefined.String.Number.Null.Boolean 引用数据类型:数组和对象 一.typeof操 ...

  4. JS & JQuery 动态添加 select option

    因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接有时候会失效,所以 ...

  5. Jmeter软件测试2--http接口测试

    上次利用Jmeter进行了webservice接口的测试,本次利用Jmeter进行http接口的测试 1.新建线程组 2.新建配置文件 3.新建http请求 4.配置动态请求 4.查看测试结果

  6. 头一回发博客,来分享个有关C++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  7. cos-26上传

    在开发中常常需要上传文件,上传文件的方式有很多种,这里有一个cos实现的例子. 首先是要拷贝cos.jar包拷贝到WEB-INF/lib目录下,然后才进行编码. 创建一个可以进行自动重命名的Java文 ...

  8. H5中需要掌握的 ANIMATION 动画效果

    CSS3的动画在PC网页上或者APP上用得越来越多,比如H5页面的应用,目前在营销传播上的意义比较大,还有企业官网或者APP主要介绍也用得比较多,当然还有很多地方都用到.所以学习css的动画也迫在眉睫 ...

  9. 手机端的META你有多了解?

    我们先来简单了解下meta标签:meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定 ...

  10. github的访问变慢了

    以下个人观点:把操作系统的自主研究还有处理器自主研究列入重点,还有互联网上的种种动作,我发现里面似乎揭示了某些迹象,科研真的不应该以牺牲大部分人的河法全益为代价甚至目的.当某一天win不可能出现在出厂 ...