首页 > 其他分享 >造船(并查集)思路详解

造船(并查集)思路详解

时间:2023-08-08 15:55:22浏览次数:32  
标签:环上 查集 基环树 详解 肯定 点数 造船

造船

题目描述:

题目描述
小Y想要在虚拟世界里造船。最开始m个船的完成度全部都为0。小Y第i时刻可以在 a_i 和b_i两艘船中选择一艘让这艘船的完成度 。

由于国家政府是奇数控,所以所有偶数完成度的船只都将被摧毁,小Y想知道m时刻后能剩下来的船只最多有多少艘。

输入格式
第一行两个整数n和m

接下来m行,每行两个整数 a,b

输出格式
输出仅有一个整数,表示m时刻后能剩下来的船只最多有多少艘。

思路详解

没有想到正解,虽然很接近(最开始我也是两两连边画图做,但是想到二分图染色去了,但这里是及时发现是错的了)
其他题解说的很迷糊,这里我想了很久给出用并查集的详解

首先对于一个并查集内,
首先考虑不存在环的情况,此时肯定存在点数>边数,很显然的是我最多只能选边数个作为答案。
竟然是非环的话,那么肯定存在度数等于1的,贪心的话肯定先取这个,然后后面都没影响了。
然后像遍历dag一样拿取点,发现最终都能拿取,但是只能拿取max=边数
其实此时就是树的情况,答案都是n-1

当然可能出现点数<=边数的情况,说明有环的存在。
首先我尝试每个点都+1
这种操作肯定是可行的:考虑环上的点,利用边,在脑子里随便取一个点dfs来遍历,dfs便历顺序就是环上点的拿取顺序。
考虑非环上的点,由于是并查集,肯定是分为两种类型的点:
1.一个点连到环上去的类型,那么这个连到环上的边就肯定是选择非环上的那个点。
2.至于不连到环上的那种类型,其实就和非环图的想法一样了。
要是操作过后没有剩下操作次数(即开始时边数=点数)。
实际上就是个基环树,我们发现,基环树是肯定可以做到的且=n。

那么要是剩余有操作次数呢?
我假设先加入一条边,那么此时必定存在一个点将会被选择两次,等价于没被选择(偶数次)
竟然没被选择的话,那就可以看成原来链接他的两条边给删除了
显然,如果这个被选择两次的点在环上,这个环会被破坏,成为树
如果不在环上,我们可以换一种顺序安排边的选择,最终也达成删成树的情况

那我接着加入边,发现这个图又变成了基环树......

所以,这个图其实就是在树个基环树中反复横跳,最终这个连通块的答案肯定是n或者n-1

实在不会建议可以跟着上述过程手动模拟一下

证毕

至于代码实现,维护点数和边数的连通块就好了,用并查集,很EZ

标签:环上,查集,基环树,详解,肯定,点数,造船
From: https://www.cnblogs.com/linghusama/p/17614589.html

相关文章

  • json web token(jwt)详解
    1.jsonwebtoken是什么?JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 2.什么时候你应该用JSONWebTokens下列场景中使用JSONWebToken是......
  • 详解Jvm中时区设置方式,推荐 代码中TimeZone.getTimeZone("Asia/Shanghai") 而不使用Ti
    详解Jvm中时区设置方式原文链接:https://www.45fan.com/article.php?aid=20090934958860528675768691这篇文章memo一下Jvm中关于时区设定的基础操作。Java的时区设定这里列出如下三种方式方式说明TimeZone.setDefault方式通过java的utils下的TimeZone进行动态设定......
  • @Transactional(rollbackFor = Exception.class) 详解 推荐的事务注解方式 @Transact
    @Transactional(rollbackFor=Exception.class)详解原文链接:https://blog.csdn.net/weixin_43987718/article/details/12342262117、@Transactional(rollbackFor=Exception.class)详解1、参考来源:https://www.cnblogs.com/clwydjgs/p/9317849.html1)、异常是分为运行......
  • 一文详解TextBrewer
    本文分享自华为云社区《TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用》,作者:汀丶。TextBrewer是一个基于PyTorch的、为实现NLP中的知识蒸馏任务而设计的工具包,融合并改进了NLP和CV中的多种知识蒸馏技术,提供便......
  • Java Spring MVC 图片上传操作详解
    JavaSpringMVC图片上传操作详解在现代的Web开发中,图片上传是一个非常常见的需求。而JavaSpringMVC框架则是JavaWeb开发中常用的框架之一。本文将介绍如何在JavaSpringMVC框架中实现图片上传操作。JavaSpringMVC图片上传操作详解1.创建文件上传表单首先需要在前端页面......
  • JavaWebSocket心跳机制详解
    JavaWebSocket心跳机制详解WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议,它提供了一种简单而强大的方式来实现实时数据传输。在使用WebSocket时,心跳机制是非常关键的,它能够保持连接的稳定性并及时发现连接的异常。本文将详细解释JavaWebSocket心跳机制的实现原理......
  • 软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
    简介在数据库中,我们常常需要从表中筛选出符合特定条件的数据,以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询,使我们能够轻松地筛选数据。本文将详细介绍MySQLWHERE条件查询的用法和示例,帮助大家更好地理解和应用这一功能。WHERE条件查询的基本语法SELECT列1,列2,.......
  • 软件测试|MySQL ORDER BY详解:排序查询的利器
    简介在数据库中,我们经常需要对查询结果进行排序,以便更好地展示数据或满足特定的业务需求。MySQL提供了ORDERBY子句,使我们能够轻松地对查询结果进行排序。本文将详细介绍MySQLORDERBY的用法和示例,帮助大家更好地理解和应用这一功能。基本语法在MySQL中,ORDERBY子句用于对查询结果......
  • 软件测试|MySQL逻辑运算符使用详解
    简介在MySQL中,逻辑运算符用于处理布尔类型的数据,进行逻辑判断和组合条件。逻辑运算符主要包括AND、OR、NOT三种,它们可以帮助我们在查询和条件语句中进行复杂的逻辑操作。本文将详细介绍MySQL中逻辑运算符的使用方法和示例。AND运算符AND运算符用于将多个条件组合起来,要求所有条件都......
  • /dev/zero是什么(详解)
    转载自:文章 FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是/dev/fb0、/dev......