当前位置: 首页 > article >正文

蓝桥杯刷题记录【并查集001】(2024)

主要内容:并查集

并查集

并查集的题目感觉大部分都是模板题,上板子!!

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)

merge函数用于判断x,y是否联通,如果联通return False。

lanqiao19719吊坠

# 并查集模板
class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)n, m = map(int, input().split()) # 输入处理strings = [] # 记录字符串
for _ in range(n):strings.append(input())# 边权为这两个字符串的最长公共子串的长度,可以按环形旋转改变起始位置,但不能翻转
def f(s):m = len(s)# 两个字符串拼接起来s_concat = s + s # 字典,键为子串长度,值为子串suffix_dict = {}for i in range(m):rotated = s_concat[i:i+m]for k in range(1, m):# 旋转之后的子串suffix = rotated[-k:]if k not in suffix_dict:suffix_dict[k] = set()suffix_dict[k].add(suffix)return suffix_dict suffix_dicts = []
for s in strings:suffix_dicts.append(f(s))# 建图,包括边权,连接点
edges = []
for i in range(n):for j in range(i+1, n):max_ij_k = 0 for k in range(m, -1, -1):suffix_set_i = suffix_dicts[i].get(k, set())suffix_set_j = suffix_dicts[j].get(k, set())# 如果两个集合相交不为空,记录max_ij_k为k,因为是逆序的,所以直接记录并breakif suffix_set_i & suffix_set_j:max_ij_k = k break weight = max_ij_kedges.append((weight, i, j))
# 边权从小到大排序
edges.sort(reverse=True, key=lambda x : x[0])
uf = UnionFind(n)
# ans记录值,cnt记录次数
ans = 0 
cnt = 0
for weight, i, j in edges:if uf.merge(i, j):ans += weightcnt += 1# 临界if cnt == n-1:break 
print(ans)

3493. 属性图

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]* n self.cnt = n def find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return False self.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def numberOfComponents(self, properties: List[List[int]], k: int) -> int:sets = list(map(set, properties))uf = UnionFind(len(properties))for i, a in enumerate(sets):for j, b in enumerate(sets[:i]):if len(a&b) >= k:uf.merge(i, j)return uf.cnt

思路:并查集,先利用集合的特性去重,根据properties的长度实例化并查集,双重循环得到集合a和集合b,根据题目要求当 intersect(properties[i], properties[j]) >= k(其中 i 和 j 的范围为 [0, n - 1] 且 i != j),节点 i 和节点 j 之间有一条边,即当满足条件时,将i,j连起来,并在merge函数中self.cnt -= 1。最终返回uf.cnt就行。

1971. 寻找图中是否存在路径

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:uf = UnionFind(n)for i, j in edges:uf.merge(i, j)return uf.is_same(source, destination)

实例化一个并查集,遍历edges中的i,j并连起来,遍历结束就使用is_same()函数进行判断是否连在一起。

200. 岛屿数量

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def numIslands(self, grid: List[List[str]]) -> int:n = len(grid)m = len(grid[0])uf = UnionFind(m*n)ocean = 0for i in range(n):for j in range(m):if grid[i][j] == "0":ocean += 1else:# 向下查看if i < n-1 and grid[i+1][j] == "1":uf.merge(i*m+j, (i+1)*m+j)# 向右查看if j < m-1 and grid[i][j+1] == "1":uf.merge(i*m+j, i*m+j+1)return uf.cnt - ocean

思路:获得grid的高n宽m,通过n*m实例化并查集,将grid中的每个元素当作一个点看,然后使用ocean记录海水的熟练,当grid[i][j]==“1”时,向下向右查看,如果下面是1将当前位置i*m+j和(i+1)*m+j连起来,当右边是1将当前位置和i*m+j+1连起来。最终返回uf.cnt-ocean即为所求答案。

1631. 最小体力消耗路径

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]* n self.cnt = n def find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return False self.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def minimumEffortPath(self, heights: List[List[int]]) -> int:n = len(heights)m = len(heights[0])uf = UnionFind(n*m)edges = []dirs = (0, 1, 0)for i in range(n):for j in range(m):for a, b in pairwise(dirs):x = i + ay = j + b if 0 <= x < n and 0 <= y < m:edges.append((abs(heights[i][j] - heights[x][y]), i*m+j, x*m+y))edges.sort() # 求最小for h, i, j in edges:uf.merge(i, j)if uf.is_same(0, m*n-1):return h return 0

思路:和岛屿数量思路类似,通过n*m实例化并查集,edges记录i,j和x,y之间的高度之差绝对值。根据这个值进行排序edges,然后开始遍历edges,每次遍历将i,j连起来,并判断起点0和m*n-1是否连起来了,连起来了就直接return h因为edges是在此之前排过序的。

924. 尽量减少恶意软件的传播

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]* n self.cnt = n def find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return False self.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def minMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int:n = len(graph)m = len(graph[0])uf = UnionFind(n)for i in range(n):for j in range(i + 1, n):graph[i][j] and uf.merge(i, j)cnt = Counter(uf.find(x) for x in initial)ans, mx = n, 0for x in initial:root = uf.find(x)if cnt[root] > 1:continuesz = uf.size[root]if sz > mx or (sz == mx and x < ans):ans = xmx = szreturn min(initial) if ans == n else ans

相关文章:

蓝桥杯刷题记录【并查集001】(2024)

主要内容&#xff1a;并查集 并查集 并查集的题目感觉大部分都是模板题&#xff0c;上板子&#xff01;&#xff01; class UnionFind:def __init__(self, n):self.pa list(range(n))self.size [1]*n self.cnt ndef find(self, x):if self.pa[x] ! x:self.pa[x] self.fi…...

基于BusyBox构建ISO镜像

1. 准备 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建议&#xff1a;系统内核<3.10.0 使用busybox < 1.33.2版本 2. 安装busybox # 安装依赖 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下载 wget https://…...

Multisim14.3的安装步骤

Multisim14.3的安装步骤 安装包链接 右击Install.exe&#xff0c;以管理员身份运行 激活前关闭杀毒软件 右击&#xff0c;以管理员身份运行 依次右键【Base Edition】、【Full Edition】、【Power ProEdition】、【Full Edition】、【Power ProEdition】&#xff0c;选择【…...

搭建环境-opencv-qt

CMake Error at cmake/OpenCVCompilerOptimizations.cmake:647 (message): Compiler doesnt support baseline optimization flags: Call Stack (most recent call first): cmake/OpenCVCompilerOptions.cmake:344 (ocv_compiler_optimization_options) CMakeList 解决方…...

【愚公系列】《高效使用DeepSeek》050-外汇交易辅助

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

SparkAudio 是什么,和其他的同类 TTS 模型相比有什么优势

欢迎来到涛涛聊AI 在当今数字化时代&#xff0c;音频处理技术已经成为人们生活和工作中不可或缺的一部分。无论是制作有声读物、开发语音助手&#xff0c;还是进行影视配音&#xff0c;我们都离不开高效、精准的音频处理工具。然而&#xff0c;传统的音频处理技术往往存在诸多…...

jvm 的attach 和agent机制

Java 的 Attach 和 Agent 机制在实际应用中得到了广泛的成功应用&#xff0c;尤其是在监控、调试、性能分析、故障排查等方面。以下是这两种机制在实际场景中的一些成功应用案例&#xff1a; 1. 性能监控与分析 Java Agent 和 Attach 机制广泛应用于性能监控和分析&#xff0…...

Java 8 到 Java 21 系列之 Optional 类型:优雅地处理空值(Java 8)

Java 8 到 Java 21 系列之 Optional 类型&#xff1a;优雅地处理空值&#xff08;Java 8&#xff09; 系列目录 Java8 到 Java21 系列之 Lambda 表达式&#xff1a;函数式编程的开端&#xff08;Java 8&#xff09;Java 8 到 Java 21 系列之 Stream API&#xff1a;数据处理的…...

py文件打包为exe可执行文件,涉及mysql连接失败

py文件打包为exe可执行文件&#xff0c;涉及mysql连接失败 项目场景&#xff1a;使用flask框架封装算法接口&#xff0c;并使用pyinstaller打包为exe文件。使用pyinstaller打包多文件的场景&#xff0c;需要自己手动去.spec文件中添加其他文件&#xff0c;推荐使用auto-py-to-e…...

Ubuntu 系统 Docker 中搭建 CUDA cuDNN 开发环境

CUDA 是 NVIDIA 推出的并行计算平台和编程模型&#xff0c;利用 GPU 多核心架构加速计算任务&#xff0c;广泛应用于深度学习、科学计算等领域。cuDNN 是基于 CUDA 的深度神经网络加速库&#xff0c;为深度学习框架提供高效卷积、池化等操作的优化实现&#xff0c;提升模型训练…...

win10彻底让图标不显示在工具栏

关闭需要不显示的软件 打开 例此时我关闭了IDEA的显示 如果说只是隐藏&#xff0c;鼠标拖动一个道理 例QQ 如果说全部显示不隐藏...

Java服务端性能优化:从理论到实践的全面指南

目录 引言&#xff1a;性能优化的重要性 用户体验视角 性能优化的多维度 文章定位与价值 Java代码层性能优化方案 实例创建与管理优化 单例模式的合理应用 批量操作策略 并发编程优化 Future模式实现异步处理 线程池合理使用 I/O性能优化 NIO提升I/O性能 压缩传输…...

人脸识别和定位别的签到系统

1、功能 基于人脸识别及定位的宿舍考勤管理小程序 &#xff08;用户&#xff1a;宿舍公告、宿舍考勤查询、宿舍考勤&#xff08;人脸识别、gps 定 位&#xff09;、考勤排行、请假申请 、个人中心 管理员&#xff1a;宿舍管理、宿舍公告管理 学生信息管理、请假审批、发布宿舍…...

基于YOLOv8的热力图生成与可视化:支持自定义模型与置信度阈值的多维度分析

目标检测是计算机视觉领域的重要研究方向&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;系列算法因其高效性和准确性成为该领域的代表性方法。YOLOv8作为YOLO系列的最新版本&#xff0c;在目标检测任务中表现出色。然而&#xff0c;传统的目标检测结果通常以边…...

echarts+HTML 绘制3d地图,加载散点+散点点击事件

首先&#xff0c;确保了解如何本地引入ECharts库。 html 文件中引入本地 echarts.min.js 和 echarts-gl.min.js。 可以通过官网下载或npm安装&#xff0c;但这里直接下载JS文件更简单。需要引入 echarts.js 和 echarts-gl.js&#xff0c;因为3D地图需要GL模块。 接下来是HTM…...

Design Compiler:库特征分析(ALIB)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 简介 在使用Design Compiler时&#xff0c;可以对目标逻辑库进行特征分析&#xff0c;并创建一个称为ALIB的伪库&#xff08;可以被认为是缓存&#xff09;&…...

便携式雷达信号模拟器 —— 打造实战化电磁环境的新利器

在现代战争中&#xff0c;雷达信号的侦察与干扰能力直接关系到作战的成败。为了提升雷达侦察与干扰装备的实战能力&#xff0c;便携式雷达信号模拟器作为一款高性能设备应运而生&#xff0c;为雷达装备的训练、测试和科研提供了不可或缺的支持。 核心功能 便携式雷达信号模拟…...

TypeScript工程集成

以下是关于 TypeScript 工程集成 的系统梳理,涵盖基础配置、进阶优化、开发规范及实际场景的注意事项,帮助我们构建高效可靠的企业级 TypeScript 项目: 一、基础知识点 1. 项目初始化与配置 tsconfig.json 核心配置:{"compilerOptions": {"target": &…...

《P1246 编码》

题目描述 编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码&#xff1a;把一些有规律的单词编成数字。 字母表中共有 26 个字母 a,b,c,⋯,z&#xff0c;这些特殊的单词长度不超过 6 且字母按升序排列。把所有这样的单词放在一起&#xff0c;按字典…...

基于Transformer框架实现微调后Qwen/DeepSeek模型的非流式批量推理

在基于LLamaFactory微调完具备思维链的DeepSeek模型之后(详见《深入探究LLamaFactory推理DeepSeek蒸馏模型时无法展示<think>思考过程的问题》),接下来就需要针对微调好的模型或者是原始模型(注意需要有一个本地的模型文件,全量微调就是saves下面的文件夹,如果是LoRA,…...

什么是 CSSD?

文章目录 一、什么是 CSSD&#xff1f;CSSD 的职责 二、CSSD 是如何工作的&#xff1f;三、CSSD 为什么会重启节点&#xff1f;情况一&#xff1a;网络和存储都断联&#xff08;失联&#xff09;情况二&#xff1a;收到其他节点对自己的踢出通知&#xff08;外部 fencing&#…...

服务器磁盘io性能监控和优化

服务器磁盘io性能监控和优化 全文-服务器磁盘io性能监控和优化 全文大纲 磁盘IO性能评价指标 IOPS&#xff1a;每秒IO请求次数&#xff0c;包括读和写吞吐量&#xff1a;每秒IO流量&#xff0c;包括读和写 磁盘IO性能监控工具 iostat&#xff1a;监控各磁盘IO性能&#xff0c…...

CentOS Linux升级内核kernel方法

目录 一、背景 二、准备工作 三、升级内核 一、背景 某些情况需要对Linux发行版自带的内核kernel可能版本较低&#xff0c;需要对内核kernel进行升级。例如&#xff1a;CentOS 7.x 版本的系统默认内核是3.10.0&#xff0c;该版本的内核在Kubernetes社区有很多已知的Bug&#…...

使用MetaGPT 创建智能体(1)入门

metagpt一个多智能体框架 官网&#xff1a;MetaGPT | MetaGPT 智能体 在大模型领域&#xff0c;智能体通常指一种基于大语言模型&#xff08;LLM&#xff09;构建的自主决策系统&#xff0c;能够通过理解环境、规划任务、调用工具、迭代反馈等方式完成复杂目标。具备主动推理…...

AF3 OpenFoldMultimerDataset类解读

AlphaFold3 data_modules 模块的 OpenFoldMultimerDataset 类是 OpenFoldDataset 类的子类,专门用于 多链蛋白质(Multimer) 数据集的训练。它通过引入 AlphaFold Multimer 论文 中描述的过滤步骤,来实现多链蛋白质的训练。这个类扩展了父类的功能,特别是为了处理多链蛋白质…...

【C++】多态功能细节问题分析

多态是在不同继承关系的类对象去调用同一函数&#xff0c;产生了不同的行为。值得注意的是&#xff0c;虽然多态在功能上与隐藏是类似的&#xff0c;但是还是有较大区别的&#xff0c;本文也会进行多态和隐藏的差异分析。 在继承中要构成多态的条件 1.1必须通过基类的指针或引用…...

[CISSP] [5] 保护资产安全

数据状态 1. 数据静态存储&#xff08;Data at Rest&#xff09; 指存储在磁盘、数据库、存储设备上的数据&#xff0c;例如&#xff1a; 硬盘、SSD服务器、数据库备份存储、云存储 安全措施 加密&#xff08;Encryption&#xff09;&#xff1a;如 AES-256 加密磁盘和数据…...

EIP-712:类型化结构化数据的哈希与签名

1. 引言 以太坊 EIP-712: 类型化结构化数据的哈希与签名&#xff0c;是一种用于对类型化结构化数据&#xff08;而不仅仅是字节串&#xff09;进行哈希和签名 的标准。 其包括&#xff1a; 编码函数正确性的理论框架&#xff0c;类似于 Solidity 结构体并兼容的结构化数据规…...

spring boot 集成redis 中RedisTemplate 、SessionCallback和RedisCallback使用对比详解,最后表格总结

对比详解 1. RedisTemplate 功能&#xff1a;Spring Data Redis的核心模板类&#xff0c;提供对Redis的通用操作&#xff08;如字符串、哈希、列表、集合等&#xff09;。使用场景&#xff1a;常规的Redis增删改查操作。特点&#xff1a; 支持序列化配置&#xff08;如String…...

基于S函数的simulink仿真

基于S函数的simulink仿真 S函数可以用计算机语言来描述动态系统。在控制系统设计中&#xff0c;S函数可以用来描述控制算法、自适应算法和模型动力学方程。 S函数中使用文本方式输入公式和方程&#xff0c;适合复杂动态系统的数学描述&#xff0c;并且在仿真过程中可以对仿真…...