http://acm.hdu.edu.cn/showproblem.php?pid=1856
题意:老师想从10000000里面找尽可能多的学生帮他做项目,条件是这些人必须都认识。给n个关系,求最多有多少个人能帮助老师做项目。
因为数据量较大,如果不进行数据压缩的话就过不去。
#include <iostream>
using namespace std;
#define N 10000005
int boy[N];
int findfather(int n){
if (boy[n]<0)
return n;
boy[n]=findfather(boy[n]);
return boy[n];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1856in.txt","r",stdin);
#endif
int n,a,b,i,min;
while (scanf("%d",&n)!=EOF){
for (i=1;i<N;i++)
boy[i]=-1;
for (i=0;i<n;i++){
scanf("%d%d",&a,&b);
a=findfather(a);
b=findfather(b);
if (a!=b){
if (boy[a]<=boy[b]){
boy[a]+=boy[b];
boy[b]=a;
}
else {
boy[b]+=boy[a];
boy[a]=b;
}
}
}
min=0;
for (i=1;i<N;i++)
if (boy[i]<min)
min=boy[i];
printf("%d\n",-min);
}
return 0;
}
本文详细解释了如何通过并查集算法解决HDOJ上的一个数学问题,即在给定学生之间的关系网络中找到最多能为老师完成项目的同学数量。通过构建并维护连通分量,最终确定最大连通群体大小。
11万+

被折叠的 条评论
为什么被折叠?



