7-22 朋友圈

xiaoxiao2021-02-28  43

7-22 朋友圈(25 分)

某学校有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

输出样例:

4/*此题目考察的是并查集的知识,详细解说参考:http://blog.csdn.net/u013546077/article/details/64509038*/

/* 并查集 7-22 朋友圈 */ #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; int s[100000]; int num[100000]; int f(int x){ if(x==s[x]) return x; else return s[x]=f(s[x]); } void change(int x,int y){ int a=f(x); int b=f(y); if(a!=b) s[a]=b; } int main(){ int n,m,i,j; int k,a,b,c; int p=0; cin>>n>>m; for(i=1;i<=n;i++){ s[i]=i; } while(m--){ cin>>k; cin>>a; k--; while(k--){ cin>>b; change(a,b); } } memset(num,0,sizeof(num)); for(i=1;i<=n;i++){ num[f(s[i])]++; } for(i=1;i<=n;i++){ if(num[i]>p) p=num[i]; } cout<<p<<endl; return 0; } /* 运行超时 */ #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; int s[100000]; int num[100000]; int f(int x){ int r; r=x; while(s[r]!=r) r=s[r]; return r; } void change(int x,int y){ int a=f(x); int b=f(y); if(a!=b) s[a]=b; } int main(){ int n,m,i,j; int k,a,b,c; int p=0; cin>>n>>m; for(i=1;i<=n;i++){ s[i]=i; } while(m--){ cin>>k; cin>>a; k--; while(k--){ cin>>b; change(a,b); } } memset(num,0,sizeof(num)); for(i=1;i<=n;i++){ num[f(s[i])]++; } for(i=1;i<=n;i++){ if(num[i]>p) p=num[i]; } cout<<p<<endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-2622067.html

最新回复(0)