首页 > 其他 > 详细

并查集(两个优化—按秩合并、路径压缩) poj2492

时间:2014-04-21 03:15:29      阅读:691      评论:0      收藏:0      [点我收藏+]

并查集有两个优化。

一、按秩合并

描述:就是在对两个不同子集连接时,按照rank来连,也就是rank低的连在rank高的下面。rank高的做父亲节点。

作用,这样类似维护了一棵树,树是rank高的在上。

二、路径压缩

描述:假如fa数组已经嵌套了N层,那么传统的做法去找祖先要做N次,当N很大时,这种做法很没效率。

这是朴素查找的代码,适合数据量不大的情况:

int findx(int x)
{
int r=x;
while(parent[r] !=r)
r
=parent[r];
return r;
}

   

    下面是采用路径压缩的方法查找元素:

int find(int x)       //查找x元素所在的集合,回溯时压缩路径
{
if (x != parent[x])
{
parent[x]
= find(parent[x]); //回溯时的压缩路径
} //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
return parent[x];
}

    

    上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:

int find(int x)
{
int k, j, r;
r
= x;
while(r != parent[r]) //查找跟节点
r = parent[r]; //找到跟节点,用r记录下
k = x;
while(k != r) //非递归路径压缩操作
{
j
= parent[k]; //用j暂存parent[k]的父节点
parent[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}
题目描述:有N个虫子。科学家认为只有两只虫子不同性别时,才会发生关系。现在给你M个关系,让你判断是否存在同性恋。

resex[x]记录的是与x性别不同的虫子。我的做法是把相同性别的虫子连在一起。下面是代码:

#include <stdio.h>
#define N 2002
int fa[N],rank[N],resex[N];
void init(int len)
{
	int i;
	for(i=1;i<=len;i++)
	{
		fa[i]=i;
		rank[i]=0;
		resex[i]=0;//代表与i性别相反的虫子号
	}
}

int find(int x)
{
	if(fa[x]!=x)
	{
		fa[x]=find(fa[x]);//路径压缩
	}
	return fa[x];
}

void Union(int a,int b)
{
	int x=find(a);
	int y=find(b);
	if(rank[x]>rank[y])//按秩合并
		fa[y]=x;
	else
	{
		fa[x]=y;
		if(rank[x]==rank[y])
			rank[y]++;
	}
}

int main()
{
	int T,n,m,i,a,b,num=0,flag;
	scanf("%d",&T);
	while(num<T)
	{
		flag=1;
		num++;
		scanf("%d%d",&n,&m);
		init(n);
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&a,&b);
			if(!flag)continue;
			int x=find(a);
			int y=find(b);
			if(x==y)flag=0;//当两只性别相同的虫子发生关系时,发现同性恋
			if(resex[a]!=0)Union(resex[a],b);//易证,a的相反性别的虫子和b性别应当相同,所以连接两者
			else resex[a]=b;
			if(resex[b]!=0)Union(resex[b],a);
			else resex[b]=a;
		}
		printf("Scenario #%d:\n",num);
		if(!flag)
			printf("Suspicious bugs found!\n\n");
		else 
			printf("No suspicious bugs found!\n\n");
		
	}
	return 0;
}



并查集(两个优化—按秩合并、路径压缩) poj2492,布布扣,bubuko.com

并查集(两个优化—按秩合并、路径压缩) poj2492

原文:http://blog.csdn.net/fei____fei/article/details/24202449

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!