并查集是一种多叉树,用于处理一些不相交集合的合并与查询问题。 初始化 每个结点单独作为一个集合。 查询 求元素所在集合的代表元素,即根结点。 合并 将两个元素所在的集合合
          并查集是一种多叉树,用于处理一些不相交集合的合并与查询问题。
初始化
每个结点单独作为一个集合。
查询
求元素所在集合的代表元素,即根结点。
合并
将两个元素所在的集合合并为一个集合。
合并之前,应先判断两个元素是否属于同一集合,用上面的查询来实现。
实现流程
动态集合中每一个元素由一个对象来表示,设x表示一个对象,并查集的实现需要如下操作:
MAKE(X)
建立一个新的集合,由于各集合是分离的,要求x没有在其他集合中出现过。
UNION(X,Y)
将包含x和y的动态集合合并为一个新的集合,假定在此操作前这两个集合是分离的。
所得集合的代表是Sx∪Sy的某个成员。
FIND(X)
返回包含x的集合的代表。


路径压缩
将元素的父亲指针全部指向根节点。
总结
初始化,
for(i=1;i<=n;i++)father[i]=i;
每个元素属于单独的一个集合,以自己作为根结点。
寻找根结点编号并压缩路径,
int find(int x){ 
	if(father[x]!=x) 
   father[x]=find(father[x]);
   return father[x];
   }
合并两个集合,
void unionn(int x,int y){
	x=find(x);
	y=find(y);
	father[y]=x; 
	}
判断元素是否属于同一集合,
bool judge(int x,int y){
	x=find(x);
   y=find(y);
   if(x==y)  
		return true;
	else 
		return false;
	}
并非原创,仅是整理,请见谅
Lo问我为什么看星星。我觉得银河和代码是同一种东西,这也是一种回答。————Co 【文章原创作者:韩国高防服务器 http://www.558idc.com/krgf.html 网络转载请说明出处】