题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 34250 Accepted Submission(s): 12134 Problem Description Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements.
Input The first line of the input contains an integer n (0 ≤ n ≤ 100 000) - the number of direct friend-pairs. The following n lines each contains a pair of numbers A and B separated by a single space that suggests A and B are direct friends. (A ≠ B, 1 ≤ A, B ≤ 10000000)
Output The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.
Sample Input 4 1 2 3 4 5 6 1 6 4 1 2 3 4 5 6 7 8
Sample Output 4 2 Hint A and B are friends(direct or indirect), B and C are friends(direct or indirect), then A and C are also friends(indirect). In the first sample {1,2,5,6} is the result. In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers. |
题意:求不同集合中最多元素的个数。
思路:很奇怪,也很气,样例过不去,提交却是对的。。。。
第一次遇到这样的事情,不知道是编译器的问题还是这道题的bug。。。。。。。。
#include<stdio.h>
#include<string.h>
const int max = 1e5+10;
int bin[max],ans[max];
int sum=0,x,y;
int find(int x) //查找,用于寻找父亲节点,经过路径压缩之后直接指向根节点。
{
int r=x;
while(bin[r]!=r)
r=bin[r];
int i=x,j; //路径压缩
while(bin[i]!=r)
{
j=bin[i];
bin[i]=r;
i=j;
}
return r;
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
bin[fx]=fy;
ans[fy]+=ans[fx];//直接加和
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
sum=0;
if(n==0)
{
printf("1\n");
continue; //注意这一步的作用
}
for(int i=1;i<=n;i++)
{
bin[i]=i;
ans[i]=1;
}
while(n--)
{
scanf("%d%d",&x,&y);
merge(x,y);
}
for(int i=1;i<=max;i++)
{
if(ans[i]>sum)
sum=ans[i];
}
printf("%d\n",sum);
}
return 0;
}