题目描述

动物王国中有三类动物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和K句话,输出假话的总数。

输入格式

第一行是两个整数N和K,以一个空格分隔。

以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。

若D=1,则表示X和Y是同类。

若D=2,则表示X吃Y。

输出格式

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

样例:

输入样例:
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
输出样例:
3

思路分析:

首先讲一下这个题目的意思,A 吃 B,B 吃 C,C 吃 A。

如果按被吃的方向来画,那么C->B->A A->C,这样就形成了一个闭环,也正是生物圈能量的循环

我们这题采用并查集的思想

约定:

食物链绕不开 A->C B->A C->B
因此,利用边的权重,即当前点到根节点的距离作为约束条件
假设根为a(也可以是b,c,因为这是闭环)
有以下三种情况:
1. a和b b->a b到根节点a的距离为1,表示b能被a吃
2. a和c c->b->a c到根节点a的距离为2,表示c能吃a,且c被b吃
3. a和a a->c->b->a a到根节点a的距离为3, 表示a和a是同类

所以我们创建两个集合,一个存放动物,另外一个存放其到父节点的距离

我们将距离对3取余,如果结果为1,则是第一种情况,为2则是第二种情况,为0则是第三种情况

核心算法:

  private static int find(int x) {;if(p[x]!=x){int tmp=find(p[x]); //开始递归;最终用tmp储存根节点d[x]+=d[p[x]]; //递归结束后为该点到根节点的距离p[x]=tmp;  //将每个点的父节点设为根节点}return p[x];   //返回父节点}

完整代码:

import java.io.*;public class Main {static int N=50010;static int []p=new int[N];  //存放动物static int []d=new int[N];  //存放每个节点到父节点的距离public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String []s=br.readLine().split(" ");int n=Integer.parseInt(s[0]),k=Integer.parseInt(s[1]);for (int i = 1; i <=n; i++) {  //初始化动物堆p[i]=i;}int res=0;   //最后结果while (k-->0){String []fir=br.readLine().split(" ");int D=Integer.parseInt(fir[0]);int x=Integer.parseInt(fir[1]);int y=Integer.parseInt(fir[2]);if(x>n || y>n){res++;}else {//px,py分别储存根节点int px=find(x);  int py=find(y);if(D==1){//如果x和y在同一个集合中,但是距离差不为0则说明不是同类是假话if(px==py && (d[x]-d[y])%3!=0) {res++;} else if(px!=py){//如果不在同一个集合则让x的根节点的父节点变为y的根节点p[px]=py;//(d[x]+d[px]-d[y])%3==0d[px]=d[y]-d[x];}}else {//如果x和y在同一个集合中,但是距离差不为1则说明不是被吃的关系是假话if(px==py && (d[x]-1-d[y])%3!=0){res++;}else if(px!=py){p[px]=py;//(d[x]+d[px]-d[y]-1)%3==0d[px]=d[y]+1-d[x];}}}}System.out.println(res);}private static int find(int x) {;if(p[x]!=x){int tmp=find(p[x]); //开始递归;最终用tmp储存根节点d[x]+=d[p[x]]; //递归结束后为该点到根节点的距离p[x]=tmp;  //将每个点的父节点设为根节点}return p[x];   //返回父节点}
}

食物链问题(并查集)相关推荐

  1. Bailian1182 POJ1182 食物链【并查集】

    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: 75814   Accepted: 22528 Description ...

  3. POJ 1182 食物链 (并查集解法)(详细注释)

    食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78510 Accepted: 23396 Description 动物王 ...

  4. POJ 1182 食物链,并查集的拓展

    http://poj.org/problem?id=1182 /******************************************************** 此道题目 前天看的时候 ...

  5. POJ1182 食物链 —— 种类并查集

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

  6. POJ 1182 食物链(并查集+偏移向量)题解

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

  7. P2024 [NOI2001]食物链[扩展域并查集]

    题目来源:洛谷 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C ...

  8. 食物链(扩展域并查集)

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

  9. 食物链 (利用并查集的两种解决方法)

    食物链是并查集中的一道经典题, 第一次看<挑战程序设计竞赛>上懵懵懂懂, 最近又看见了发现还是一脸懵逼. 首先题目如下 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形 ...

  10. 算法:食物链(并查集)

    并查集 1.将两个集合合并 2.询问两个元素是否在一个集合当中 基本原理:每个集合用一棵树来表示.树根的编号就是整个集合的编号.每个节点存储它的父节点,p[x]表示x的父节点. 问题1:如何判断树根: ...

最新文章

  1. AAAI | 深度生成模型—NEVAE
  2. vue插槽样式_vue 插槽简介及使用示例
  3. VFS文件系统结构分析 与socket
  4. C++ primer 详解(第三章)
  5. Tensorflow 错误总结:ImportError: cannot import name add_newdocs.
  6. 【XAudio2】8.怎么播放音效
  7. stmmac 中断处理
  8. mysql 附加数据库文件_mysql附加数据库文件
  9. 高级ZK:异步UI更新和后台处理–第2部分
  10. 【音视频安卓开发 (七)】安卓视频播放窗口去掉标题栏、全屏、横屏
  11. 项目管理(4):备战pmp
  12. 简单解释什么是 依赖注入 和 控制反转
  13. 黄哲铿:妙用“缓存”,应对亿级流量峰值(文末赠书)
  14. linux 文件-s,Linux下访问文件的基本模式
  15. 双向关联一对一映射详解(1)
  16. hlsl之ambient
  17. c语言成绩统计与学籍管理源码,[源码和文档分享]基于C语言的学生成绩管理系统...
  18. matlab preparets,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?
  19. IDEA导入MySQL驱动包(Mac版)
  20. MB/s MiB/s之间换算

热门文章

  1. [中兴建设有限公司安徽分公司](https://www.zxjsah.cn)
  2. win11使用adb安装安卓app
  3. GAN、DCGAN、WGAN、SRGAN
  4. 2018年全球广告行业报告:5个现状、8个趋势~附PDF
  5. 注意!白盒、SDN/NFV的“魔掌”正在向互联网交换中心(IXP)逼近
  6. 使用python 解罗马数字转整数
  7. 声音引擎Wwise与Criware的区别
  8. Unity-Wwise-Oculus踩坑笔记
  9. 用skia实现2D绘制
  10. 医院有线电视数字前端改造系统解决方案