本文参考了:洛谷p2024题解

题目描述

动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B

吃 C,C 吃 A。

现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道

它到底是哪一种。

有人用两种说法对这 N 个动物所构成的食物链关系进行描述:

第一种说法是“1 X Y”,表示 X 和 Y 是同类。

第二种说法是“2 X Y”,表示 X 吃 Y 。

此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真

的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

• 当前的话与前面的某些真的话冲突,就是假话

• 当前的话中 X 或 Y 比 N 大,就是假话

• 当前的话表示 X 吃 X,就是假话

你的任务是根据给定的 N 和 K 句话,输出假话的总数。

输入格式

从 eat.in 中输入数据

第一行两个整数,N,K,表示有 N 个动物,K 句话。

第二行开始每行一句话(按照题目要求,见样例)

输出格式

输出到 eat.out 中

一行,一个整数,表示假话的总数。

输入输出样例

输入 #1复制

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
输出 #1复制

3

说明/提示

1 ≤ N ≤ 5 ∗ 10^4

1 ≤ K ≤ 10^5

第一次遇到这样的题,真的是一筹莫展,自己大概想到要分成3个种族,但是并不知道怎么维护。当看了洛谷上的大神的题解,真的是醍醐灌顶。原来直接用三倍并查集可以很方便的解决这类维护种族间关系的问题。

此题可以作为一个此类种族间关系的模板来使用

大概思路:一倍存同种族,二倍存猎物,三倍存天敌。定义find(x)得x的祖先

 //若x,y同种族,则同种族的同种族,x,y的猎物同种族,x,y的天敌同种族
join(x,y)
join(x+n,y+n)
join(x+*n,y+*n) find(x) == find(y)// x y同种族
find(x+n) == find(y) //y是x的猎物,也就是x吃y的关系
find(x+*n) == find(y) //x是y的猎物,也就是y吃x的关系

AC代码

#include <bits/stdc++.h>
using namespace std;
const int NN = 5e4+; int n,m;
int a[*NN]; int find(int x){ //去找公共祖先
if(x!=a[x])
a[x] = find(a[x]);
return a[x];
}
void join(int x,int y){ //合并集合
int fx = find(x),fy = find(y);
if(fx!=fy){
a[fx] = fy;
}
} int main(){
cin>>n>>m;
for(int i = ;i<=*n;i++) a[i] = i; //并查集操作前的初始化
int t,x,y;
int coun = ;//错误次数
while(m--){
scanf("%d%d%d",&t,&x,&y);
if(x>n || y>n){ //错误情况
coun++;
continue;
}
if(t == ){
if(find(x+n) == find(y) || find(x+*n) == find(y)){ //x 与 y非同种族关系
coun++;
}else{
join(x,y);join(x+n,y+n);join(x+*n,y+*n); //让x,y同种族, x,y的猎物同种族,x,y的天敌同种族
}
}else{
if(x==y){ //错误情况
coun++;
}else if(find(x) == find(y) || find(x+*n) == find(y)){ //非x吃y的关系
coun++;
}else{
join(x+n,y);join(x+*n,y+n);join(x,y+*n); //谁吃谁的关系
}
}
}
cout<<coun<<endl;
return ;
}

种族并查集模板题分析 -----P2024 [NOI2001]食物链的更多相关文章

  1. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  2. HDU 1213 - How Many Tables - [并查集模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...

  3. 并查集模板题----P3367 【模板】并查集

    题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi ...

  4. 杭电ACM省赛集训队选拔赛之热身赛-How Many Tables,并查集模板题~~

    How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. POJ1611 The Suspects 并查集模板题

    题目大意:中文题不多说了 题目思路:将每一个可能患病的人纳入同一个集合,然后遍历查找每个点,如果改点点的根节点和0号学生的根节点相同,则该点可能是病人. 模板题并没有思路上的困难,只不过在遍历时需要额 ...

  6. PAT甲题题解-1114. Family Property (25)-(并查集模板题)

    题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...

  7. HDU-1232/NYOJ-608畅通工程,并查集模板题,,水过~~~

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) http://acm. ...

  8. HDU1232 畅通工程 (并查集模板题)

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. 并查集模板题(The Suspects )HZNU寒假集训

    The Suspects Time Limit: 1000MS Memory Limit: 20000KTotal Submissions: 36817 Accepted: 17860 Descrip ...

随机推荐

  1. ASP.NET MVC ActionFilterAttribute 方法解释(区别)

    1.OnActionExecuting        在Action方法调用前使用,使用场景:如何验证登录等. 2.OnActionExecuted      在Action方法调用后,result方 ...

  2. Oracle 学习笔记二

    一.oracle通用函数vnl(a,b) 用于任何类型,如果a的值不为null返回a的值否则返回b的值 条件判断oracle中可以使用 case 字段 when 条件1 then 表达式1 when ...

  3. TencentTbs腾讯浏览服务 x5内核使用

    Tencent TBS (下简称TBS) 腾讯浏览服务 What is it? 百度百科解释: 腾讯浏览服务(Tencent Browsing Service,以下简称TBS),由腾讯X5浏览服务升级 ...

  4. docker实战(一)之Tomcat的安装

           docker号称分分钟就可以将环境构建完成,这话一点也不假,因为docker在使用软件时只需要从官方 仓库中拉取对应的镜像就行了.docker的使用前需要了解两个名词--镜像和容器.这两 ...

  5. python黑帽子学习笔记1:pyqt5 designer+wmi实现进程监视器

    环境说明:python3.6 所需要模块:wmi.pyqt5.pythonMagick 先放上一张成品效果图,如图所示: 界面利用pyqt5的designer实现,画好界面如下图所示: 画好后,保存好 ...

  6. 技术派-不用sqrt手工计算平方根

    题目:任意长度数串,不使用sqrt函数,手工计算平方根?   要求只准用加/减/乘/除四则运算,不准使用power/sqrt等函数.   算法如下: 1.以小数点为中心往两边每2位分隔为一组: 2.然 ...

  7. PowerDesigner添加唯一键(mysql)

    1.打开Columns选项卡 2.选中要添加唯一键的字段 3.点击工具栏Create Key按钮,如图 4.打开创建key窗口,根据情况修改约束名称,不修改也可以 5.切换到mysql选项卡,选中“U ...

  8. perspective transform透视矩阵快速求法+矩形矫正

    算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为1的正方形的变换方式=.=   不怎么用得上…… 公式推导推半天,计算还麻烦.... ++++++++++++++++++++++++++ ...

  9. 一份关于.NET Core云原生采用情况调查

    调查背景 Kubernetes 越来越多地在生产环境中使用,围绕 Kubernetes 的整个生态系统在不断演进,新的工具和解决方案也在持续发布.云原生计算的发展驱动着各个企业转向遵循云原生原则(启动 ...

  10. jdk1.8HashMap底层数据结构:散列表+链表+红黑树,jdk1.8HashMap数据结构图解+源码说明

    一.前言 本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系. 二.jdk1.8 HashMap底层数据结构图 三.源码 1.散列表(Hash table ...