PAT 1107. Social Clusters (30)
2017-11-19 15:26
441 查看
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:
Sample Output:
并查集
每个人都有很多很多的爱好,如果两个人有相同的爱好,他们就属于统统一个集合。
求集合数和每个集合的人数,降序输出。
将相同爱好的人加入并查集,统计祖先的个数就可以了。
#include<bits/stdc++.h>
using namespace std;
const int N=1123;
int f
,ans
;
vector<int>v
;
map<int,int>mp;
bool cmp(int a,int b)
{
return a>b;
}
int Find(int x)
{
if(x!=f[x])f[x]=Find(f[x]);
return f[x];
}
void Join(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
f[fx]=fy;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<=1001; i++)
{
f[i]=i;
}
for(int i=1; i<=n; i++)
{
int k;
scanf("%d:",&k);
for(int j=0; j<=k-1; j++)
{
int x;
scanf("%d",&x);
v[x].push_back(i);
}
}
for(int i=1; i<=1001; i++)
{
if(v[i].size()>1)
{
for(int j=1; j<=(int)v[i].size()-1; j++)
{
Join(v[i][0],v[i][j]);
}
}
}
for(int i=1; i<=n; i++)
{
int fx=Find(i);
if(mp.find(fx)!=mp.end())mp[fx]++;
else mp[fx]=1;
}
map<int,int>::iterator it;
int cnt=0;
for(it=mp.begin(); it!=mp.end(); it++)
{
ans[cnt++]=it->second;
}
sort(ans,ans+cnt,cmp);
printf("%d\n",cnt);
for(int i=0; i<=cnt-1; i++)
{
if(i==cnt-1)printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
return 0;
}
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
并查集
每个人都有很多很多的爱好,如果两个人有相同的爱好,他们就属于统统一个集合。
求集合数和每个集合的人数,降序输出。
将相同爱好的人加入并查集,统计祖先的个数就可以了。
#include<bits/stdc++.h>
using namespace std;
const int N=1123;
int f
,ans
;
vector<int>v
;
map<int,int>mp;
bool cmp(int a,int b)
{
return a>b;
}
int Find(int x)
{
if(x!=f[x])f[x]=Find(f[x]);
return f[x];
}
void Join(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
f[fx]=fy;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<=1001; i++)
{
f[i]=i;
}
for(int i=1; i<=n; i++)
{
int k;
scanf("%d:",&k);
for(int j=0; j<=k-1; j++)
{
int x;
scanf("%d",&x);
v[x].push_back(i);
}
}
for(int i=1; i<=1001; i++)
{
if(v[i].size()>1)
{
for(int j=1; j<=(int)v[i].size()-1; j++)
{
Join(v[i][0],v[i][j]);
}
}
}
for(int i=1; i<=n; i++)
{
int fx=Find(i);
if(mp.find(fx)!=mp.end())mp[fx]++;
else mp[fx]=1;
}
map<int,int>::iterator it;
int cnt=0;
for(it=mp.begin(); it!=mp.end(); it++)
{
ans[cnt++]=it->second;
}
sort(ans,ans+cnt,cmp);
printf("%d\n",cnt);
for(int i=0; i<=cnt-1; i++)
{
if(i==cnt-1)printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
return 0;
}
相关文章推荐
- PAT 1107. Social Clusters (30) 并查集
- PAT 甲级 1107. Social Clusters (30)
- PAT 1107. Social Clusters (30) 特殊问题+并查集+数量信息并查集
- PAT - 甲级 - 1107. Social Clusters (30) (并查集)
- PAT (Advanced Level) Practise 1107. Social Clusters (30) 并查集
- pat-a 1107. Social Clusters (30)
- pat 1107. Social Clusters (30)
- PAT_A 1107. Social Clusters (30)
- 【PAT】1107. Social Clusters (30)
- PAT 1107. Social Clusters (30)
- PAT (Advanced Level)1107. Social Clusters (30)并查集
- pat甲级 1107. Social Clusters (30)
- 【PAT】【Advanced Level】1107. Social Clusters (30)
- PAT甲级 1107. Social Clusters (30)
- PAT (Advanced Level) 1107. Social Clusters (30)
- PAT (Advanced Level) Practise 1107 Social Clusters (30)
- PAT (Advanced Level) Practise 1107 Social Clusters (30)
- PAT(A) - 1107. Social Clusters (30)
- Pat(A) 1107. Social Clusters (30)
- PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)