解析:又是一个并查集。
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->并查集
原文地址:http://blog.csdn.net/a809146548/article/details/44277857