并查集基础知识
来源:互联网 发布:linux给用户root权限 编辑:程序博客网 时间:2024/06/02 06:49
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
主要操作:
初始化:把每个点所在集合初始化为其自身。通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
查找:查找元素所在的集合,即根节点。
合并:将两个元素所在的集合合并为一个集合。通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。
hdu1232:http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include <iostream>#include <cstdio>#include <cstring>using namespace std;void init(int a[], int n){ for (int i=1; i<=n; ++i) a[i] = -1;}int find(int a[], int x){ int t = x; while (a[t]>=0)//查找祖先t t = a[t]; while (a[x]>=0)//路径压缩 { int j = x; x = a[x]; a[j] = t; } return t;}void merge(int a[], int x, int y){ x = find(a, x); y = find(a, y); if (x==y)//祖先相同返回 return; if (a[x]>=a[y])//数量少的合并到数量多的上面(此时a[x]a[y]均为负,负的程度代表有多少个结点) { a[y] += a[x]; a[x] = y; } else if (a[x]<a[y]) { a[x] += a[y]; a[y] = x; }}int main(){ int a[1005], n, m, s, e, cnt; while (~scanf("%d", &n)) { if (n==0) break; scanf("%d", &m); init(a, n); for (int i=0; i<m; ++i) { scanf("%d%d", &s, &e); merge(a, s, e); } cnt = 0; for (int i=1; i<=n; ++i) if (a[i]<0) cnt ++; printf("%d\n", cnt-1); } return 0;}
- 并查集基础知识
- 并查集基础知识
- 并查集基础知识
- 并查集(不相交集合)基础知识详解
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- JavaScript高级程序设计_1~6章的练习
- 【rzxt】笔者支招:从内存入手提高电脑速度
- 设计模式——工厂方法模式
- Android百度定位API使用方法
- HDU-1032
- 并查集基础知识
- 如花美眷,似水流年。
- codeforces 34D - Road Map DFS
- 使用PushMeBaby测试推送,log显示成功但设备没有收到信息的同学来看!
- [shell][科普]Shell命令用法
- HDU-1076
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- poj 1226 Substrings
- Android 设置屏幕亮度