算法学习——并查集
2017-09-05 12:47
405 查看
并查集
一 并查集的概念
并查集是一种维护集合的数据结构,其名字中的“并”, “查”, “集”分别取自Union(合并),Find(查找),Set(集合)。并查集支持以下两个操作:
1. 合并:合并2个集合
2. 查找:判断两个元素是否在同一集合
并查集的基本实现方式:
数组 int father
, 其中father[i]表示i的父节点,father[i] == i说明i为根节点,一个集合只有一个根节点,且将其作为所属集合的标识。
二 并查集的基本操作
1. 初始化:for(int i = 1; i <= n; i++) father[i] = i;//一开始每个元素都是一个独立的集合
2. 查找:
int find(int x){ int a = x; while(x != father[x]){ x = father[x]; } while(a != father[a]){//路径压缩 int z = a; a = father[a]; father[z] = x; } return x; }
3. 合并:
注意一定是先找到各自的根节点,再把一个根节点设为另一个的父亲。
for(int i = 1; i <= n; i++){ scanf("%d:", &k); while(k--){ scanf("%d", &f); if(fond[f] == 0){ fond[f] = i; } Union(i, fond[f]); } }
三 使用技巧
1.统计根节点个数(集合个数)int isroot[MAX] = {0}, num = 0;
for(int i = 1; i <= n; i++){ isroot[find(i)]++; }
for(int i = 1; i <= n; i++){ if(isroot[i]) num++; }
2.统计各个集合中的元素个数
for(int i = 1; i <= num; i++){ printf("%d", isroot[i]); if(i != num) printf(" "); }3.根据共同爱好分组
int fond[MAX] = {0};
for(int i = 1; i <= n; i++){ scanf("%d:", &k); while(k--){ scanf("%d", &f); if(fond[f] == 0){ fond[f] = i; } Union(i, fond[f]); } }
相关文章推荐
- 一个找亲戚游戏,引发了一场算法的学习——并查集
- 算法模板学习专栏之并查集(一)入门
- 算法学习之并查集
- 算法学习——并查集
- 算法学习之并查集
- 并查集算法学习(转)
- 算法学习 并查集(Union-Find) (转)
- 数据结构与算法学习-并查集
- poj 2524-小白算法学习 并查集 Ubiquitous Religions
- 【算法学习】【数据结构】并查集
- 【算法学习笔记】44. 并查集补充 SJTU OJ 3015 露子的星空
- 算法学习 并查集(笔试题目:找同伙)
- 算法学习基础篇(四):数据结构(堆、二叉搜索树、并查集)
- 算法:并查集学习笔记
- 算法分析学习笔记(一) - 动态连通性问题的并查集算法(上)
- 并查集。路径压缩 算法运用学习(一)
- 每日学习一算法【4】01背包问题
- 算法与数据结构学习 05 查找
- 韩顺平_PHP程序员玩转算法公开课(第一季)04_阶段性答疑解惑_学习笔记_源代码图解_PPT文档整理
- ML之监督学习算法之分类算法一 ——— 决策树算法