【算法专题】图论专题:并查集


并查集 是一种树型的数据结构,用于处理一些不相交集合的合并和查询问题。在使用中常常以森林来表示。

基本结构

并查集也是用来维护集合的,和前面学习的 set 不同之处在于,并查集能很方便地同时维护很多集 合。如果用 set 来维护会非常的麻烦。并查集的核心思想是记录每个结点的父亲结点是哪个结点。

  • 初始化
void init() {    
 for (int i = 1; i <= n; ++i) {        
  fa[i] = i;     
  } 
  }
  • 查找
int get(int x) {     
if (fa[x] == x) { 
// x 结点就是根结点         
return x;     
}   
return get(fa[x]); // 返回父结点的根结点 }
  • 合并
void merge(int x, int y) {     
x = get(x);     
y = get(y);    
 if (x != y) { // 不在同一个集合       
   fa[y] = x;     
 }
 }

并查集实现

首先,我们把要用的变量初始化。

int fa[110]; 
int n, m;

我们先把并查集的框架实现好,便于后面直接调用。我们先实现初始化,用一个 init() 函数来实现初 始化。初始化实际上就是把每个点的父亲结点赋值为自己。

void init() {    
 for (int i = 1; i <= n; i++) {         
 fa[i] = i;     
 } 
 } 

接下来,我们继续实现get函数

int get(int x) {     
if (fa[x] == x) {         
return x;     
}     
return get(fa[x]); 
}

接下里我们实现 merge 函数,合并两个结点到一个集合。合并的方法很简单,先找到各自的根结点,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值