英语四六级系列(二)
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
昨天,小明期待已久的英语四六级出成绩了,不幸的是,小明没有及格(::>_<::)。通过和自己的好友聊天,小明知道了很多好友的成绩。于是,无聊的小明自己划分了一些分数段,并统计自己的好友在每个分数段的人数(有些分数段只有一个人),他想知道人数最多的分数段有多少人。
可是,小明数学不太好,你能帮一下他吗? 假设他有n名好友,好友编号为0~n-1。
输入
多组输入,每组第一行是两个整数n,m(2 <= n <= 10000, 0 <= m <=1000)。
接下来m行,每行两个整数a,b(0 <= a,b <= n-1)。
代表好友a和好友b在同一个分数段上。
输出
输出一行,输出人数最多的分数段有多少人。
示例输入
4 2 1 2 2 3 6 3 0 1 2 3 2 4
示例输出
3 3
提示
来源
xj
示例程序
#include "stdio.h"
int bin[100002],a[10001],j;
/*find3(x)
{
int r = x;
while (bin[r] != r) //循环结束,则找到根节点
r = bin[r];
int i = x;
while (i!=r) //本循环修改查找路径中所有节点
{
j = bin[i];
bin[i] = r;
i = j;
}
return r;
}*/
int find3(int x)
{
int r=x;
while(bin[r] !=r)
r=bin[r];
return r;
}
void merge(int x,int y)
{
int fx,fy;
fx = find3(x);
fy = find3(y);
if(fx != fy)
{
bin[fx] = fy;
}
}
int main()
{
int n,m,i,x,h,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
int c = 0;
for(i=0;i<n;i++)
bin[i] = i;
for(h=m;h>0;h--)
{
scanf("%d %d",&x,&y);
merge(x,y);
}
for(i=0;i<n;i++)
{
a[find3(i)]++;
if(a[find3(i)]>c)
{
c = a[find3(i)];
}
}
/*for(count=0, i=0;i<n;i++)
if(bin[i] == i)
count ++;
printf("Case %d: %d\n",z,count);
z++;*/
printf("%d\n",c);
}
return 0;
}