PAT (Advanced Level) Practise 1107 Social Clusters (30)
2017-06-30 13:27
573 查看
1107. Social Clusters (30)
时间限制1000 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
When register on a social network, you are always asked to specify your hobbies in order to find some potential friends with the same hobbies. A "social cluster" is a set of people who have some of their hobbies in common. You are supposed to find all the clusters.
Input Specification:
Each input file contains one test case. For each test case, the first line contains a positive integer N (<=1000), the total number of people in a social network. Hence the people are numbered from 1 to N. Then N lines follow, each gives the hobby list of a
person in the format:
Ki: hi[1] hi[2] ... hi[Ki]
where Ki (>0) is the number of hobbies, and hi[j] is the index of the j-th hobby, which is an integer in [1, 1000].
Output Specification:
For each case, print in one line the total number of clusters in the network. Then in the second line, print the numbers of people in the clusters in non-increasing order. The numbers must be separated by exactly one space, and there must be no extra space
at the end of the line.
Sample Input:
8 3: 2 7 10 1: 4 2: 5 3 1: 4 1: 3 1: 4 4: 6 8 1 5 1: 4
Sample Output:
3 4 3 1
题意:有n个人,每个人有k个爱好,有相同爱好的为一类,问一共有几类,每类各有多少人
解题思路:把每个爱好分配给一个人,相同爱好的人用并查集合并一下
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <bitset> using namespace std; #define LL long long const int INF = 0x3f3f3f3f; int n,f[1005],vis[1005],cnt[1005]; int k,a; int Find(int x) { return f[x]==x?x:f[x]=Find(f[x]); } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++)f[i]=i; memset(vis,0,sizeof vis); memset(cnt,0,sizeof cnt); for(int i=1;i<=n;i++) { scanf("%d:",&k); for(int j=1;j<=k;j++) { scanf("%d",&a); if(!vis[a]) vis[a]=i; else { int aa=Find(i); int bb=Find(vis[a]); if(aa!=bb) f[aa]=bb; } } } int sum=0; for(int i=1;i<=n;i++) { if(f[i]==i) sum++; int aa=Find(i); cnt[aa]++; } sort(cnt+1,cnt+1+n,greater<int>()); printf("%d\n%d",sum,cnt[1]); for(int i=2;i<=sum;i++) printf(" %d",cnt[i]); printf("\n"); } return 0; }
相关文章推荐
- PAT (Advanced Level) Practise 1107. Social Clusters (30) 并查集
- PAT (Advanced Level) Practise 1107 Social Clusters (30)
- PAT (Advanced Level) 1107. Social Clusters (30)
- PAT (Advanced Level)1107. Social Clusters (30)并查集
- 【PAT】【Advanced Level】1107. Social Clusters (30)
- PAT (Advanced Level) Practise 1095 Cars on Campus (30)
- PAT (Advanced Level) Practise 1038 Recover the Smallest Number (30)
- 1014. Waiting in Line (30)——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1034 Head of a Gang (30)
- PAT (Advanced Level) Practise 1018. Public Bike Management (30)
- PAT (Advanced Level) Practise 1022. Digital Library (30)
- PAT (Advanced Level) Practise 1004. Counting Leaves (30)
- 1038. Recover the Smallest Number (30)【排序】——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1018 Public Bike Management (30)
- PAT (Advanced Level) Practise 1111 Online Map (30)
- PAT (Advanced Level) Practise 1111. Online Map (30) Dijstra单源最短路
- PAT (Advanced Level) Practise 1127 ZigZagging on a Tree (30)
- PAT (Advanced Level) Practise 1111 Online Map (30)
- 1014. Waiting in Line (30)——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1018. Public Bike Management (30)