难度警告!今天的题思路比较复杂,涉及数学知识congruence class

每天一道算法居然已经一个月了啊,期间居然没断更哈哈
呼呼~算法基础课过去三分之一了,啊后面好像越来越难了呜呜呜,还能保持日更吗?哭了

题目
动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。
A 吃 B,B 吃 C,C 吃 A。
现有 N 个动物,以 1∼N 编号。
每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这 N 个动物所构成的食物链关系进行描述:

1.第一种说法是 1 X Y,表示 X 和 Y 是同类
2.第二种说法是 2 X Y,表示 X 吃 Y
3.此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的

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

当前的话与前面的某些真的话冲突,就是假话;
当前的话中 X 或 Y 比 N 大,就是假话;
当前的话表示 X 吃 X,就是假话。

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

输入
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
输出
3
public class 并查集_食物链 {//初始化,p代表所有的集,d代表到根节点的距离public static int N = 100010;public static int[] p = new int[N], d = new int[N];public static void main(String[] args) throws IOException{//初始化,p数组中初始根节点都指向自己,d初始都为0即可BufferedReader in = new BufferedReader(new InputStreamReader(System.in));String[] init_data = in.readLine().split(" ");int n = Integer.parseInt(init_data[0]), m = Integer.parseInt(init_data[1]);for (int i = 1; i<=n; i++) {p[i] = i;}//res代表假话数量初始为1int res = 0;//操作区域while (m-- > 0){String[] data_arr = in.readLine().split(" ");int t = Integer.parseInt(data_arr[0]), x = Integer.parseInt(data_arr[1]), y = Integer.parseInt(data_arr[2]);//三条规则之一,x或y大于n,假if (x > n || y > n) {res++;}else {int px = find(x), py = find(y);//t=1判断x和y是不是同类if (t == 1) {//首先判断x和y是不是在一颗树上,在一颗树上并且x到根节点的距离%3和y到根节点的距离%3相等,说明是同类,反之不是if (px==py && (d[x]-d[y])%3 != 0){res++;}//如果不在一颗树上,那说明这句话必定是真话,xy是同类,将x树和y树合在一起,让x的根节点指向y的根节点//而此时我们不知道d[px]是该设为多少//但我们知道xy是同类那他们到根节点的距离%3是相等的,也就是d[x] + d[px] ≡ d[y],就能得知d[y]-d[x] = d[px]//这里涉及数学知识congruence class,感兴趣可以查一查else if (px!=py) {p[px] = py;d[px] = d[y] - d[x];}}//t=2判断x能不能吃yelse if (t == 2) {//判断x和y在不在一棵树上,在一棵树上同时x到根节点的距离+1如果和y到根节点的距离相等,说明x可以吃y,反之不是if (px==py && (d[x]-d[y]-1)%3 != 0) {res++;}//不在一棵树上说明是真话,x能吃y,x%3应该比y%3大1//然后设置d[px]的距离,道理和上面相同,只不过这次是d[x] - 1 + d[px] ≡ d[y], 也就是d[y]-d[x]+1 = d[px]else if (px!=py) {p[px] = py;d[px] = d[y]+1-d[x];}}}}System.out.println(res);}//并查集的查找public static int find(int x) {if (p[x]!=x) {//切记这里是先拿到上一个元素,然后加上上一个元素到根节点的距离,这样最后我们就得到了x到根节点的距离int t = find(p[x]);d[x] += d[p[x]];//最后进行并查集的优化,让所有点都直接指向根节点p[x] = t;}return p[x];}
}

就拿题目作为例子
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
第一次为假,因为101大于给定数100
第二次为真,1吃2
第三次为真,2吃3
第四次为假,3不能吃3,同类不能吃同类
第五次为假,1和3不是同类
第六次为真,3可以吃1
第七次为真,5和5是同类
最后输出假话次数3

这里其实有个很有意思的点,就是给定的条件里并没有告诉我们3能吃1,但我们根据1->2->3,食物链需要形成闭环,那么就可以推断出3->1

用并查集实现这道题的思路就是,我们以当前点到根节点的距离%3的结果来判断当前点的种类,因为%3只有3k,3k+1,3k+2,三种可能,这样我们就能知道如果x%3和y%3相等,那么他们的种类是一样的,如果x%3和y-1%3相等,代表x吃y,例如x=1,y=2, 1%3=2-1%3

声明:算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流

java---并查集算法_食物链(每日一道算法2022.8.17)相关推荐

  1. php算法在线刷题,c,算法_每日一道算法:leetcode 刷题碰到的问题。,c,算法 - phpStudy...

    每日一道算法:leetcode 刷题碰到的问题. 这是题目: Given an unsorted array nums, reorder it such that nums[0] < nums[ ...

  2. java并查集_一个非常实用而且精妙的算法-并查集(java语言实现)

    在学习数据结构的时候,老师多少会提到并查集,他的应用也是超级广泛.本文首先会通过案例来对并查集有一个介绍.然后给出并查集的java实现. 一.并查集原理 话说在江湖上有很多门派,这些门派相互争夺武林霸 ...

  3. java并查集找朋友圈_图—并查集(解决朋友圈问题)

    图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构.图可以分为两种,无向图和有向图. ★图的定义: ★典型问题: 利用图能够解决很多问题,这里有一个较为典型的问题,假如已知有n个人和 ...

  4. java并查集判断是否是连通图_并查集-判断图的连通

    首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分 ...

  5. java并查集判断是否是连通图_判断 连通图 (图论_并查集)

    给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的. 输入:每组数据的第一行是两个整数n 和m(0< n <=1000).n 表示图的顶点 数目,m 表示图中边的数目.如果n ...

  6. 并查集/poj1182 noi2001食物链eat

    题意 有三类动物A,B,C,题中给出两种关系: 1 x y :x y 同类 2 x y :x吃y 对于假话的定义: 1.当前的话与前面的某些真的话冲突,就是假话: 2.当前的话中X或Y比N大,就是假话 ...

  7. 【并查集】noi2001食物链

    P2024 [NOI2001]食物链 //这是一道比我年纪大的题啊啊啊啊啊QAQ 加权并查集  三倍并查集好厉害qwq 图源洛谷题解 贴代码qwq 1 #include<cstdio> 2 ...

  8. wikioi-天梯-提高一等-并查集-1074:食物链

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

  9. java并查集计算机网络连通,poj2236 Wireless Network(并查集)

    题意:有n台损坏的电脑,现要将其逐台修复,且使其相互恢复通信功能.若两台电脑能相互通信,则有两种情况,一是他们之间的距离小于d,二是他们可以借助都可到达的第三台已修复的电脑.给出所有电脑的坐标位置,对 ...

最新文章

  1. LeetCode简单题之图像渲染
  2. SQL注入是什么?如何防止?
  3. 经典排序算法(11)——计数排序算法详解
  4. [FZYZOJ 1038] 隧道
  5. 十、封装python3读写ini文件类
  6. conda deactivate python3_conda进行python环境隔离
  7. XP下卸载IE8还原到IE7的解决方法
  8. Jmeter性能测试实战教程系列-搭建分布式性能测试环境(五)
  9. 虚拟试衣APP软件一站式开发
  10. 利用US-100超声波传感器测距的核心代码
  11. 【Python基础】初识-与君初相识,犹如故人归
  12. 数字政府智慧政务一网通办解决方案2022
  13. git从远程仓库拉取指定日期版本的代码到本地
  14. Newtonsoft.Json.JsonSerializationException
  15. php 表示什么,php是什么意思
  16. uni app 零基础小白到项目实战-1
  17. 数字示波器中单位:Kpts, PPM, Sa/s, wfs
  18. 腾讯云-服务临时密钥
  19. sql语句添加列带注释默认为null
  20. 如何进入UI设计行业 什么学习路线适合新手

热门文章

  1. 企业如何在办公系统中实践阿米巴
  2. 抖音上退货如何赔偿?星志远电商
  3. PS简易通道抠图的方法
  4. micropython常用模块有那个_Python常用模块,不明觉厉先马后看
  5. vant 半圆仪表盘_超全的 Vue 开源项目合集,签收一下
  6. AMD、CMD、UMD
  7. 3D真人手办自己也能做,颠覆你的想象!
  8. 好用的国产远程控制软件,我只推荐这款!
  9. PR曲线和ROC曲线理解
  10. 解决Docker缺少字体导致Easyexcel无法导出的问题