代码随想录 并查集
并查集是用来判断两个元素是否在同一集合内,或者将两个元素放入同一个集合中。并查集使用的方法是通过将所有元素转化成一个高度为一的多叉树,如果这两个元素的根相同,那么他们就是一个以下是代码模板
int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好
vector<int> father = vector<int> (n, 0); // C++里的一种数组结构
// 并查集初始化
void init() {
for (int i = 0; i < n; ++i) {
father[i] = i;
}
}
// 并查集里寻根的过程
int find(int u) {
return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}
// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {
u = find(u);
v = find(v);
return u == v;
}
// 将v->u 这条边加入并查集
void join(int u, int v) {
u = find(u); // 寻找u的根
v = find(v); // 寻找v的根
if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
father[v] = u;
}
寻找存在的路径
解题思路
判断从A到B的路径是否存在,我们是需要判断A和B是否属于同一个集合,在图论中,“同一个节点就是指A和B的路途上有边连在一起。
知识点
并查集
心得
学习了并查集的基础知识并加以利用
冗余连接
解题思路
能够将无向图转化为树,那么说明避免两个元素在同一个集合内,我们只需要利用并查集找到第一个输入的节点在同一集合内的就行。
知识点
并查集
心得
理解了并查集之后就很容易做出来
冗余连接II
解题思路
本题是有向图,和无向图相比,需要考虑的更多。当一个节点的入度为2时,需要判断哪条边可以删除,优先删除顺序靠后的点。如果整个有向图没有入度为2的节点时,说明有环了,我们只需要删掉环内的其中1边即可。而查找的方式则使用并查集,把所有连接的两个节点放入并查集,遇到要删除的边就跳过
知识点
并查集,有向图
心得
注意遍历节点的时候要从后往前遍历
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构