题目描述:
Description
昨天,小明期待已久的英语四六级出成绩了,不幸的是,小明没有及格(::>_<::)。通过和自己的好友聊天,小明知道了很多好友的成绩。于是,无聊的小明自己划分了一些分数段,并统计自己的好友在每个分数段的人数(有些分数段只有一个人),他想知道人数最多的分数段有多少人。
可是,小明数学不太好,你能帮一下他吗? 假设他有n名好友,好友编号为0~n-1。
Input
多组输入,每组第一行是两个整数n,m(2 <= n <= 10000, 0 <= m <=1000)。
接下来m行,每行两个整数a,b(0 <= a,b <= n-1)。
代表好友a和好友b在同一个分数段上。
Output
输出一行,输出人数最多的分数段有多少人。
Sample Input
4 2 1 2 2 3 6 3 0 1 2 3 2 4
Sample Output
3 3
#include <stdio.h>
#include <stdlib.h>int set[10005];
int num[10005];
int max;
int jihe(int x)
{
int r;
r=x;
while(r!=set[r])
{
r=set[r];
}
int k,y=x;
while(y!=r)
{
k=set[y];
set[y]=r;
y=k;
}
return r;
}
void merge(int x,int y)
{
int a,b;
a=jihe(x);
b=jihe(y);
if(a!=b)
set[b]=a;
}
int main()
{
int n,m,a,b;
int i,j,p;
while(~scanf("%d%d",&n,&m))
{
max=0;
memset(num,0,sizeof(num));
p=1;
for(i=0; i<n; i++)
set[i]=i;
while(m--)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
for(i=0; i<n; i++)
{
if(i!=jihe(i))
num[jihe(i)]++;
else
num[i]++;
}
for(i=0; i<n; i++)
{
max=max>num[i]?max:num[i];
}
printf("%d\n",max);
}
return 0;
}