题意:有3种动物A、B、C,形成一个“A吃B, B吃C,C吃A ”的食物链。有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类。;第二种说法是"2 X Y",表示X吃Y。假设输入为(d,X,Y)。可知,当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 

1) 当前的话与前面的某些真的话冲突,就是假话; 

2) 当前的话中X或Y比N大,就是假话; 

3) 当前的话表示X吃X,就是假话。
要求输出假话的总数。

解法:带权并查集。同【bzoj 1202】[HNOI2005] 狡猾的商人(图论--带权并查集+前缀和)类似,判断假话的条件一就是要与之前得到的结果冲突。所以推断出用并查集的原因绝对不是因为有3“种”动物,而是因为这个“之前有结果就判断,没有结果就存储”的操作。

于是由于已经知道要用并查集,就需要推出树上结点的关系,使f[x]表示动物x与其所在联盟的根节点R的关系(x→R)。再通过枚举的方法,列举出所有情况,得出规律。再应用到具体的函数等操作中。

QUESTION!!!(这里理应大写加粗~)  OMG!!!∑(゚Д゚ノ)ノ我突然间发现若用“方块图”,我下面的所有推导都显得无比无比的复杂啊!直接转换x→y(定义x下y上)的关系为:x到y的距离 或 x上面方块的个数,所有的都可以一步写出来呀!有神牛告诉我带权并查集都是可以这样理解的吗?!!!!所有的找父亲结点并更新自己的find(x)函数那里,f[x]都是f[x]+f[fx]吗。。。

推导过程如下:如图1所示,设x,y分别是R的子结点;如图2所示,x→R表示x吃R,相应数字。0为x,R同类,1为x吃R,2为R吃x;具体对应情况枚举如图3所示。
于是据图3找规律,相加不行便相减,发现(第一行数-第二行数+3)%3=第三行数,即(f[x]-f[y]+3)%3=d-1。(d为输入中x,y的关系种类)

因此,根据这一条树上的规律,我们就可以把它应用到所有函数中了。具体请见代码——

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6
7 const int N=50010,M=100010;
8 int fa[N],f[N];
9 int n,m;
10
11 int ffind(int x)
12 {
13 if (fa[x]!=x)
14 {
15 int fx=fa[x];
16 fa[x]=ffind(fx);
17 /*推导:
18 f[x]=(f[x]-f[fa[x]]+3)%3;
19 =(f[x]-((3-f[fx])%3)+3)%3;
20 */
21 f[x]=(f[x]+f[fx])%3;
22 }
23 return fa[x];
24 }
25 int main()
26 {
27 scanf("%d%d",&n,&m);
28 int cnt=0;
29 for (int i=1;i<=n;i++) fa[i]=i,f[i]=0;
30 for (int i=1;i<=m;i++)
31 {
32 int d,x,y;
33 scanf("%d%d%d",&d,&x,&y);
34 if (x>n||y>n||(d==2&&x==y)) {cnt++;continue;}
35 d--;//
36 int fx=ffind(x),fy=ffind(y);
37 if (fx!=fy)
38 {
39 fa[fx]=fy;
40 /*推导:
41 int t=(3-f[x])%3;//fx->x
42 int tt=(3-d)%3;//y->x
43 int w=(t-tt+3)%3;//fx->y
44 int ww=(3-f[y])%3;//fy->y
45 f[fx]=(w-ww+3)%3;//fx->fy
46 */
47 f[fx]=(f[y]-f[x]+d+3)%3;
48 }
49 else if ((f[x]-f[y]+3)%3!=d) cnt++;
50 }
51 printf("%d\n",cnt);
52 return 0;
53 }

--------------------------------------------------------------------------------------------------------------------------------

另外啊~我学习了一下好友的做法:x->y间的边权直接看成距离,1为x吃y,0为同类。这样一个食物链的x,y,z的关系都可直接推出!!○| ̄|_  orz~
还有,合并父亲时,可以让y变为fx的父亲,而不是fy变为fx的父亲,这样虽然增大了树的深度,但影响不大,重要的是可以节省一些代码。

【poj 1182】食物链(图论--带权并查集)的更多相关文章

  1. POJ 1182 食物链 【带权并查集】

    <题目链接> 题目大意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我 ...

  2. POJ 1182 食物链 (带权并查集)

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

  3. POJ 1182 食物链 【带权并查集/补集法】

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

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

    设相等的边权为0,吃的边权为,被吃的边权为2,然后用带权并查集在%3的意义下做加法即可 关系为简单环的基本都可以用模环长的方式是用带权并查集 #include<iostream> #inc ...

  5. POJ 1182 食物链(带权并查集)

    传送门 食物链  Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65579   Accepted: 19336 Descri ...

  6. POJ:1182 食物链(带权并查集)

    http://poj.org/problem?id=1182 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1 ...

  7. 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)

    题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...

  8. 【poj 1988】Cube Stacking(图论--带权并查集)

    题意:有N个方块,M个操作{"C x":查询方块x上的方块数:"M x y":移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法: ...

  9. 【poj 1962】Corporative Network(图论--带权并查集 模版题)

    P.S.我不想看英文原题的,但是看网上题解的题意看得我 炒鸡辛苦&一脸懵 +_+,打这模版题的代码也纠结至极了......不得已只能自己翻译了QwQ . 题意:有一个公司有N个企业,分成几个网 ...

随机推荐

  1. 【JavaWeb】i18n 国际化

    i18n 国际化 什么是 i18n 国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问. 希望相同的一个网站,不同人访问的时候 ...

  2. .NET 5网络操作的改进

    随着.net 5在11月的发布,现在是谈论网络栈中许多改进的好时机.这包括对HTTP.套接字.与网络相关的安全性和其他网络通信的改进.在这篇文章中,我将重点介绍一些版本中更有影响力和更有趣的变化. H ...

  3. SQL查找连续出现的数字

    基于Oracle: 题:编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | ...

  4. 【Docker】在Linux系统中安装Docker虚拟机、启动停止重启查看Docker命令

    安装Docker 文章目录 安装Docker Docker虚拟机架构 在Linux系统中安装Docker虚拟机 管理Docker虚拟机 参考资料 Docker虚拟机架构 Docker创建的所有虚拟实例 ...

  5. 【System】I/O密集型和CPU密集型工作负载之间有什么区别

    CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...

  6. 【葵花宝典】kolla部署OpenStack-AllinOne

    1.关闭防火墙以及内核安全机制 systemctl stop firewalld systemctl disable firewalld ##永久性关闭 setenforce 0 sed -i 's/ ...

  7. 运用 pyinstaller 打包的python exe文件运行 去掉命令行窗口及其他参数汇总

    运行exe文件的时候,会弹出一个dos命令窗口,这个窗口可以看到一些打印信息,如果想只运行tkinter 页面,去掉dos窗口需要在打包的时候 加上 -w 参数 pyinstaller -F XX.p ...

  8. TCP客户端程序

    TCP客户端程序的函数调用顺序为:socket -> connect -> send/recv socket.send和recv函数在TCP服务器程序中已经说过了,这里就不赘述了. con ...

  9. 前置时间(Lead Time),也称前置期、备货周期

    https://wiki.mbalib.com/wiki/前导时间 什么是前导时间 所谓的前导时间(leading time),就是产品从设计,到生产.物流.销售的过程. BELLWETHER:&qu ...

  10. macro-name replacement-text 宏 调试开关可以使用一个宏来实现 do { } while(0)

    C++ 预处理器_w3cschool https://www.w3cschool.cn/cpp/cpp-preprocessor.html C++ 预处理器 预处理器是一些指令,指示编译器在实际编译之 ...