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

python 蓝桥杯之并查集

文章目录

  • 总述
  • 合并过程
  • 查找过程
  • 算法实战
    • 实战1

总述

并查集(Disjoint-set Union,简称并查集)是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题,通常涉及到以下两种操作:

  1. 合并(Union): 将两个集合合并成一个集合。
  2. 查询(Find): 查找某个元素所属的集合。

并查集通常应用于解决连接问题,如判断无向图中的连通分量、网络连接状态的判断、社交网络中的好友关系等。在算法竞赛和数据结构课程中也经常会涉及到并查集的应用场景,比如 Kruskal 算法中的边权值排序,以及求解最小生成树等。

合并过程

在这里插入图片描述

在这里插入图片描述

  • 合并的过程就是先找到两个元素的根,若根不相同则将其中的一个根的父节点改成另一个根节点
s = [i for i in range(N+1)]  # 列表s[i] 表示i 节点的父节点,开始的时候,全部指向自己
def union(x,y):r1 = find(x)r2 = find(y)if r1 != r2:s[r1] = s[r2]

查找过程

在这里插入图片描述

  • 对于查找的过程,就是一直找
def find(x):  # 返回 x 的根节点if x != s[x]:s[x] = find(s[x])return s[x]

算法实战

实战1

在这里插入图片描述
在这里插入图片描述

from collections import defaultdictn = int(input())
p = [i for i in range(n + 1)] # p[i] 表示 节点 i 的父节点
tree = defaultdict(list) # 输入键,当键不存在就生成键:列表
used = [0] * (n + 1) # 用来记录是否访问过
ans = [0] * n  # 用来反复记录路径def find(x):    # 并查集的查找函数,返回x 节点的根if x != p[x]:p[x] = find(p[x])return p[x]def dfs(pos, idx):ans[idx] = posif pos == end:res = sorted(ans[:idx + 1]) # 排序print(' '.join(map(str, res))) # 输出,间隔空格输出 returnfor d in tree[pos]: # 逐一访问节点的邻接节点if not used[d]: # 由于是无向图,并且加上深度搜索,所以要记录一个节点是否已经访问过used[d] = 1dfs(d, idx + 1)for _ in range(n):u, v = map(int, input().split()) tu, tv = find(u), find(v) if tu == tv:start, end = u, v  break  # 所以是不必加载全部的边的关系的,因为当两个输入的节点的根相同的时候,就说明已经包含环了else:p[tv] = tutree[u].append(v)tree[v].append(u) # 无向图used[start] = 1
dfs(start, 0) 

代码分析

  • 不能直接暴力地去深度搜索,会超时
  • 用并查集来判断两个节点是否位于不同的连通分支
  • 并查集并不是死板地运用全部的合并和查找函数
  • 深度搜索只是一种工具并不是死板地运用全部的框架

相关文章:

  • 自动驾驶功能场景 逻辑场景 具体场景解释
  • 【Linux系统】线程
  • 复盘-word
  • 公众号IP白名单已添加服务器IP 122.88... 依然给出 40164 错误
  • 探索Java多线程开发
  • CSS3基础2
  • MySQL中的JOIN操作
  • Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间
  • PostgreSQL常用命令汇总
  • WPF DataGrid常用属性
  • AHU 数据库 实验五
  • 【论文整理】自动驾驶场景中Collaborative Methods多智能体协同感知文章创新点整理
  • STM32FreeRTOS信号量(STM32cube高效开发)
  • LeetCode 120. 三角形最小路径和
  • 探索机器学习的无限可能性:从初学者到专家的旅程
  • ES6系统学习----从Apollo Client看解构赋值
  • ES学习笔记(12)--Symbol
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Js基础——数据类型之Null和Undefined
  • nfs客户端进程变D,延伸linux的lock
  • Redis的resp协议
  • Twitter赢在开放,三年创造奇迹
  • Vue组件定义
  • 程序员最讨厌的9句话,你可有补充?
  • 基于游标的分页接口实现
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 入口文件开始,分析Vue源码实现
  • 实战|智能家居行业移动应用性能分析
  • 微信小程序设置上一页数据
  • 小程序 setData 学问多
  • 一份游戏开发学习路线
  • 阿里云ACE认证之理解CDN技术
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #13 yum、编译安装与sed命令的使用
  • #Linux(Source Insight安装及工程建立)
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $.ajax()参数及用法
  • (1)Android开发优化---------UI优化
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • **PHP二维数组遍历时同时赋值
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .Net Web项目创建比较不错的参考文章
  • .NET 设计模式初探
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 无限分类
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net生成的类,跨工程调用显示注释
  • @EventListener注解使用说明
  • @RequestBody与@ModelAttribute