并查集
并查集:也被称为不相交集数据结构。顾名思义,并查集主要操作是合并与查询,它是把初始不相交的集合经过多次合并操作后合并为一个大集合,然后可以通过查询判断两个元素是否已经在同一个集合中了。
class UnionFind(object): """并查集类""" def __init__(self, n): """长度为n的并查集""" self.uf = [-1 for i in range(n + 1)] self.sets_count = n # 判断并查集里共有几个集合, 初始化默认互相独立 def find(self, p): """尾递归""" # 当前值索引位置,-1没有数据,不在当前集合,直接作为根节点返回 if self.uf[p] < 0: return p # 当前索引有数据,递归查找该数据 self.uf[p] = self.find(self.uf[p]) return self.uf[p] def union(self, p, q): """连通p,q 让q指向p""" proot = self.find(p) qroot = self.find(q) if proot == qroot: return elif self.uf[proot] > self.uf[qroot]: # 负数比较, 左边规模更小 self.uf[qroot] += self.uf[proot] self.uf[proot] = qroot else: self.uf[proot] += self.uf[qroot] # 规模相加 self.uf[qroot] = proot # 数值指向p self.sets_count -= 1 # 连通后集合总数减一 def is_connected(self, p, q): """判断pq是否已经连通""" return self.find(p) == self.find(q) # 即判断两个结点是否是属于同一个祖先
参考:https://www.cnblogs.com/yscl/p/10185293.html
时刻记着自己要成为什么样的人!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)