并查集模板

这是我们学长都在用的一个模板,感觉挺实用的,我也就暂时拿过来了;

并查集在某些问题的解决上具有重大的作用,就像我们新生赛的最后一题,还有被称为并查集最好一题—食物链,还有我们学校oj的典型例题—病毒,这些问题使用并查集可以大大减少代码量,我现在对并查集的理解处于一个非常基础的阶段,但我想在这里记录一下我对并查集的认识。

首先,并查集,不同的元素可能不属于一个集合,但是每一个属于一个同一个集合的元素必然彼此之间有着某种关系,正是因为这种关系我们把它们合并到同一个集合,并给他们一个代表,以方便查找;

ps:并查集总是和树(二叉树)相关联,树的遍历过程有三种:先序,中序,后序;有一个算是在考研中比较难又经常出的题:给出任意两种遍历方式,让你求出最后一种遍历方式应该出现的数据顺序(主要是应用了递归的思想,这个我以后会尝试做一下留在博客上);

int fa[N];
void init(int n) { //并查集初始化
for (int i = 0; i <= n; i++)
fa[i] = i;
}
}
void unin(int u, int v) {//并查集合并操作
int fau = find(u);
int fav = find(v);
if (fau == fav) return;
fa[fav] = fau;
}
int find(int u) {//查找集合编号操作
if (fa[u] != u) {
fa[u] = find(fa[u]);
}
return fa[u];
}


/* 实际上,可以写的更短


int fa[N];
void init(int n) {
for (int i = 0; i <= n; fa[i] = i) fa[i] = i;
}
void unin(int u, int v) {
fa[find(v)] = find(u);
}
int find(int u) {
return fa[u] == u ? fa[u] : fa[u] = find(fa[u]);
}
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值