union-find算法(并查集)

本文介绍了动态连通性问题,并通过union-find算法进行解决。该算法涉及自反性、对称性和传递性的等价关系,用于判断触点间的连通性。文章详细阐述了union-find的API,包括合并分量、获取分量标识符、判断连通性和计算分量数量。并展示了具体的操作过程和实例,展示了如何通过union-find数据结构高效实现这些功能。
摘要由CSDN通过智能技术生成


任何一种算法都是为解决某个问题而生的, union-find是用于解决 动态连通性问题的一种算法。

动态连通性

考虑有一列整数对,一对整数pq可以被理解为p和q是相连的。我们假设相连是一种等价关系,它具有:
(1)自反性pp是相连的。
(2)对称性:如果pq是相连的,那么qp也是相连的。
(3)传递性:如果pq相连,且qr相连,那么pr也是相连的。
当且仅当两个对象相连时它们就属于同一个等价类,因此可以把对象分为多个等价类。

我们将对象称为触点,将整数对称为连接,将等价类称为连通分量分量
每个分量包含多个触点,且有一个标识符。

API

为了简单说明问题,我们的触点都是从0开始连续的非负整数

void Union(int p, int q);     // 连接p和q
int Find(int p);              // p所在分量的标识符
bool Connected(int p, int q); // p和q是否连接
size_t Count();               // 连通分量的数量

如果两个触点在不同的分量中,Union操作会把两个分量合并Find操作会返回给定触点所在的连通分量的标识符Connected操作能够判断两个触点是否属于同一个分量Count操作返回所有连通分量的个数
如一开始有N个分量,将连个分量归并的Union操作都会使分量总数减1

如此一来,就把解决动态连通性问题转化为了实现上述API。我们需要提供一种数据结构表示已知的连接,并基于此高效地实现这些API

union-find声明

union_find.h

#ifndef UNION_FIND
#define UNION_FIND

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值