数据结构之并查集小结
2012-07-22 23:29
204 查看
数据结构---并查集小结
By-Missa
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 (百度百科)
大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)
View Code
一点心得:
个人感觉对于那些种类并查集应该都可以用食物链的关系来理解的,通过记录与根结点的关系来判断是否在一个集合。。。刚刚把poj1703翻译成食物链版本,下次试试把上面这些题都翻译成食物链版本。。。。
一些其他的并查集题目汇总:
http://hi.baidu.com/czyuan%5Facm/blog/item/531c07afdc7d6fc57cd92ab1.html
By-Missa
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 (百度百科)
大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)
View Code
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAXN 30010 int fa[MAXN],ans[MAXN],sum[MAXN]; int P; void init() { for(int i=0;i<MAXN;i++) { fa[i]=i; ans[i]=0; sum[i]=1; } } int find(int x) { int tmp; if(x != fa[x]) { tmp=fa[x]; fa[x]=find(fa[x]); if(sum[x] != 0) { ans[x] += sum[tmp]; sum[tmp] += sum[x]; sum[x] =0; } else { ans[x] += ans[tmp]; } } return fa[x]; } void unio(int x,int y) { int fx=find(x); int fy=find(y); fa[fx]=fy; } int main() { char c; int a,b; init(); scanf("%d",&P); while(P--) { getchar(); scanf("%c",&c); if(c=='M') { scanf("%d%d",&a,&b); unio(a,b); find(a);//每次合并后都得更新,防止下次合并出错 find(b); } else { scanf("%d",&a); find(a); printf("%d\n",ans[a]); } } }
一点心得:
个人感觉对于那些种类并查集应该都可以用食物链的关系来理解的,通过记录与根结点的关系来判断是否在一个集合。。。刚刚把poj1703翻译成食物链版本,下次试试把上面这些题都翻译成食物链版本。。。。
一些其他的并查集题目汇总:
http://hi.baidu.com/czyuan%5Facm/blog/item/531c07afdc7d6fc57cd92ab1.html
相关文章推荐
- Redis系列(一):数据结构
- 数据结构实验3---二叉树的遍历(递归、非递归)
- 数据结构——算法之(025)( 求一个数组的最长递减子序列)
- 5-14 数据结构啊poi W.区间对
- Python 数据结构与算法——选取算法(TopK)
- MOOC浙大数据结构 — 08-图9 关键活动 (30分)
- 用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构
- 数据结构之栈与队列
- 数据结构——c语言描述 第五章 (1) 特殊矩阵的压缩存储
- 小技巧(11)-Jquery递归获取XML数据生成ul-li结构
- 【数据结构之List::iterator】leetcode LRUCache
- 数据结构实验之图论七:驴友计划
- SDUT 2137 数据结构实验之求二叉树后序遍历和层次遍历
- [150422][C++]数据结构复习——队列实现源码
- 栈与队列-出栈序列统计(数据结构基础 第3周)
- python--数据结构
- SDUT 2122 数据结构实验之链表七:单链表中重复元素的删除
- 【3】Python 数据结构
- 数据结构——顺序表的创建及功能函数
- kernel的数据结构