<题目链接>

题目大意:

动物王国中有三类动物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句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 
1) 当前的话与前面的某些真的话冲突,就是假话; 
2) 当前的话中X或Y比N大,就是假话; 
3) 当前的话表示X吃X,就是假话。 
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。 


Input

第一行是两个整数N和K,以一个空格分隔。 
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。 
若D=1,则表示X和Y是同类。 
若D=2,则表示X吃Y。


Output

只有一个整数,表示假话的数目。


Sample Input

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5

Sample Output

3

解题分析:
带权并查集经典习题,每个点需要维护它与父节点之间的关系,rnk为0代表同类,为1代表它吃父节点,为2代表父节点吃它,对于每次增加的关系,如果根节点相同,则直接判断是否冲突,如果不同,则将两个动物之间新的关系连接,并且更新所维护的值即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int M = 5e4+;
int n,k;
int father[M],rnk[M];
//rnk[]表示,0同类 1吃父节点 2被父节点吃
void init(){
for(int i=;i<=n;i++){
father[i]=i;
rnk[i]=;
}
}
int find(int x){
if(father[x]==x)return x;
int tmp=father[x];
father[x]=find(father[x]);
rnk[x]=(rnk[x]+rnk[tmp]+)%;
return father[x];
}
int Union(int typ,int x,int y){
int f1=find(x),f2=find(y);
if(f1==f2){ //对于根节点相同的,直接判断是否冲突
if((rnk[x]-rnk[y]+)%==typ-)return ;
return ;
}
father[f1]=f2; //以被吃的动物为根
rnk[f1]=(-rnk[x]+rnk[y]+typ-+)%; //利用矢量运算,得到rnk[f1]的值
return ;
}
int main(){
scanf("%d%d",&n,&k);
init();
int ans=;
while(k--){
int typ,x,y;
scanf("%d%d%d",&typ,&x,&y);
if(x>n||y>n)ans++;
else if(typ==&&x==y)ans++;
else ans+=Union(typ,x,y);
}
printf("%d\n",ans);
return ;
}

2018-10-04

最新文章

  1. 通过 listboxitem 查找属于listbox第几条数据
  2. 知道创宇研发技能表v3.1
  3. Linux - Yum的常用方法总结
  4. c#批量插入示例
  5. ERP基本功——物料的四个量
  6. sybase下convert函数第三个参数(时间格式)
  7. SSRS生成报表
  8. 查看linux进程(强制中止进程),服务及端口号,
  9. Aix项目_shell_rsh_01
  10. Linux Shell编程(3)——运行shell脚本
  11. ERROR:the server has either erred or is incapable of performing the requested operation
  12. &lt;input type=button&gt; 跳转页面
  13. openSUSE13.2安装Nodejs并更新到最新版
  14. windows环境下配置zookeeper
  15. django笔记整理
  16. 对象是存入cookie中需要注意
  17. Python介绍及环境配置
  18. 使用phpexcel上传下载excel文件
  19. ubuntu MySQL的安装
  20. logical_backup: expdp/impdp

热门文章

  1. Native、Web App、Hybrid、React Native(简称RN)、Weex 间的异同点。
  2. Linux下创建C函数库
  3. H - Repeats (重复最多子串的次数)
  4. LibreOJ 题解汇总
  5. python标准库之secrets
  6. 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg
  7. nagios系列(一)centos6.5环境部署nagios服务端
  8. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
  9. Oracle 数据库逻辑结构
  10. 测试开发之Django——No7.Django模板中的过滤器