🐵指尖猴全新升级
第13课:并查集的概念
🤝

并查集的概念

朋友的朋友也是朋友,大家连成一片!

📖知识引入

🤝并查集干嘛
高效回答“x和y是否在同一个集合”,还能随时合并两个集合
🗂️fa数组
fa[x]存x的上级,一路向上找到集合的大当家——根
🔗合并操作
把一个集合的根挂到另一个集合的根下面,两家变一家
⚡近乎O(1)
配合路径压缩,查询和合并快到几乎不花时间
💡
初始化时fa[i]=i,让每个元素自成一个集合,自己就是自己的代表

🔍并查集三件套

int fa[10005];

int find(int x) {            // 找 x 所在集合的根
    while (fa[x] != x) x = fa[x];
    return x;
}

void unite(int x, int y) {   // 合并两个集合
    fa[find(x)] = find(y);   // x 的根挂到 y 的根下面
}

// 使用前初始化:for (int i = 1; i <= n; i++) fa[i] = i;

初始化、找根、合并,三段代码撑起并查集的全部骨架。

🎯小测验

第1题:并查集最擅长解决什么问题?

第2题:初始化时fa[i]应该等于?

第3题:合并x和y所在集合的正确写法是?

📝本课知识点

  • ✓fa数组存上级
  • ✓find找到集合的根
  • ✓合并=根挂根
第13课完成!继续探索下一课吧 🚀