题目描述
小明所在的学校有N个学生,形成M个俱乐部。每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈。一个学生可以同时属于若干个不同的俱乐部。根据“我的朋友的朋友也是我的朋友”这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友。请编写程序计算最大朋友圈中有多少人。
输入格式
输入包含多组测试数据,每组输入的第一行包含两个正整数N(<=30000)和M(<=1000),分别代表学校的学生总数和俱乐部的个数。后面的M行每行按以下格式给出1个俱乐部的信息,其中学生从1~N编号:
第i个俱乐部的人数Mi(空格)学生1(空格)学生2……学生Mi
输出
对于每组输入,输出一个整数,表示在最大朋友圈中有多少人。
样例输入
7 4
3 1 2 3
2 1 4
3 5 6 7
1 6
10 1
1 7
样例输出
4
1
#include <stdio.h>
#include <string.h>
int stu[30010], sum[30010];
int n, m;
int findRoot(int t)
{
if(stu[t] == -1)
return t;
else
return stu[t] = findRoot(stu[t]);
}
int main()
{
int i, j;
while(scanf("%d%d", &n, &m) != EOF)
{
memset(stu, -1, sizeof(stu));
for(i = 1; i <= n; i++)
sum[i] = 1;
for(i = 1; i <= m; i++)
{
int tmp, a, b;
scanf("%d %d", &tmp, &a);
for(j = 1; j < tmp; j++)
{
scanf("%d", &b);
int l = findRoot(a);
int h = findRoot(b);
if(l == h) continue;
if(l != h)
{
stu[h] = l;
sum[l] += sum[h];
sum[h] = sum[l];
}
}
}
int max = -1;
for(i = 1; i <= n; i++)
{
if(sum[i] > max)
max = sum[i];
}
printf("%d\n", max);
}
return 0;
}