码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1856 More is better->并查集

时间:2015-03-15 16:52:47      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:并查集   acm   c++   算法   编程   

解析:又是一个并查集。

1、题意:王老师需要一些男生帮他做事。要求男生之间都是朋友关系,可以直接的,也可以间接地。最多可以挑选出几个男生(最少挑一个)?
2、并查集,求所有集合中最大集合的元素个数。

3、要注意一个地方是:当n=0时,要输出1。


#include<iostream>   
#include<algorithm>
using namespace std;

int p[10000001],num[10000001];

bool Init(int n)                //一开始指向自己
{
	for(int i=0;i<=10000000;i++)
	{
		p[i]=i;
		num[i]=1;               //一开始每个集合都只有一个元素
	}
	return true;
}

int Find(int x)            //找到根节点
{
	int r,i,j;

	r=x;
	while(r!=p[r]) r=p[r];      //路径压缩准备,找到根节点

	i=x;
	while(i!=p[i])
	{
		j=p[i];
		p[i]=r;
		i=j;
	}
	return i;                 //返回根节点
}

bool Merge(int x,int y)      //返回是否需要合并
{
	int tx,ty;

	tx=Find(x);
	ty=Find(y);

	if(tx==ty) return false;
	p[tx]=ty;
	num[ty]+=num[tx];              //合并集合元素个数
	return true;
}

int main()  
{ 
	int n,a,b,max,i,maxnum;

	while(scanf("%d",&n)==1)
	{
		Init(n);
		maxnum=0;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a,&b);
			maxnum=maxnum>a?maxnum:a;
			maxnum=maxnum>b?maxnum:b;
			Merge(a,b);
		}
		max=1;              //注意0个时也为1
		for(i=1;i<=maxnum;i++)
			if(max<num[i])
				max=num[i];

		printf("%d\n",max);;
	}
    return 0;  
}


HDU ACM 1856 More is better->并查集

标签:并查集   acm   c++   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/44277857

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!