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
#include<stdio.h>
#include<string.h>
int set[10002];
int b[10002];
int min(int x, int y)
{
return x<y?x:y;
}
int max(int x, int y)
{
return x>y?x:y;
}
void merge(int x, int y, int N)
{
int i, j, k;
i = min(x, y);
j = max(x, y);
for(k=0; k<N; k++)
{
if(set[k] == j)
set[k] = set[i];
}
return ;
}
int main()
{
int n ,m, x, y, i, q;
while(scanf("%d", &n)!=EOF)
{
memset(set, 0, sizeof(set));
memset(b, 0, sizeof(b));
for(i=0; i<n; i++)
{
set[i] = i;
}
scanf("%d", &m);
for(i=0; i<m; i++)
{
scanf("%d %d", &x, &y);
merge(x, y, n);
}
for(i = 0; i < n; i++)
{
b[set[i]]++;
}
int q = -1;// q只要小于0即可
for(i=0; i<n; i++)
{
if(q < b[i])
{
q = b[i];
}
}
printf("%d\n", q);
}
return 0;
}