并查集
1.合并两个集合
2.查询两个数是否在一个集合
基本原理:
每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个结点存储他的父节点,p[x]表示x的父节点
1.是否是一个集合 if( find(a)==find(b) )
2.合并两个集合 p[find(a)]=find(b)
static int p[]=new int[N]; static int find(int x){ //返回x的祖宗结点+路径压缩 if(p[x]!=x) p[x]=find(p[x]); return p[x]; }