ACM天梯赛 L3-003. 社交集群 (并查集)
2016-07-15 22:12
435 查看
L3-003. 社交集群
时间限制1000 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。
输入格式:
输入的第一行给出正整数N(<=1000),即社交网络中的用户总数(则用户从1到N编号)。随后N行,每行按下列格式列出每个人的兴趣爱好:
Ki: hi[1] hi[2] ... hi[Ki]
其中Ki(>0)是第i个人的兴趣的数量,hi[j]是第i个人的第j项兴趣的编号,编号范围为[1, 1000]内的整数。
输出格式:
首先在第一行输出整个网络中集群的数量,然后在第二行按非递增的顺序输出每个集群中用户的数量。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
8 3: 2 7 10 1: 4 2: 5 3 1: 4 1: 3 1: 4 4: 6 8 1 5 1: 4
输出样例:
3 4 3 1
思路:
有点水啊,并查集一波,完事。
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<cstdio> using namespace std; const int maxn=1005; vector<int>a[maxn]; bool vis[maxn]; //标记兴趣 int n,num,id,f[maxn]; int res[maxn],pos=0;//记录结果 int getf(int x) { return x==f[x]?x:(f[x]=getf(f[x])); } void merge(int x,int y) { int fx=getf(x); int fy=getf(y); if(fx!=fy) { f[fy]=fx; } } void findgroup() { for(int i=0;i<maxn;i++) { if(vis[i]) { int size=a[i].size(); for(int j=1;j<size;j++) { merge(a[i][0],a[i][j]); } } } } int main() { scanf("%d",&n); for(int i=0;i<maxn;i++)f[i]=i; memset(vis,false,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%d:",&num); while(num--) { scanf("%d",&id); vis[id]=true; a[id].push_back(i); } } findgroup(); for(int i=0;i<n;i++)f[i]=getf(f[i]); sort(f,f+n); int now=f[0]; for(int i=0;i<n;i++) { if(f[i]==now)res[pos]++; else { pos++; res[pos]++; now=f[i]; } } pos++; sort(res,res+pos); //for(int i=0;i<n;i++)printf("%d ",f[i]); //cout<<endl; printf("%d\n",pos); for(int i=pos-1;i>=0;i--) { if(i==pos-1)printf("%d",res[i]); else printf(" %d",res[i]); } printf("\n"); }
相关文章推荐
- XML解析和序列化
- switch语句
- Tomcat9源码编译及导入Eclipse
- 猪数
- 【OpenCV笔记 08】OpenCV中分离颜色通道split()和图像通道混合merge()
- STM32学习笔记之外部中断实验
- HDU 2824 The Euler function
- 计算机专业本科论文
- 静态代码分析与代码质量安全
- 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
- 网络基本功(一):细说网络传输
- Java正影响着一代程序员
- 我不是一直IT小鸟
- pthread_join和pthread_detach
- wait 与 waitpid
- SCJD考得是你对java性能比较全面得理解
- Mint17安装Remarkable编辑器
- 7、div、span
- Web.py - ctx
- 解剖最近被发现的Mac OS木马 – OSX/Keydnap 20160712