时间限制
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 <bits/stdc++.h>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define memc(a,b) memcpy(a,b,sizeof(b))
#define rep(i,a,n) for(int i=a;i<n;i++) ///[a,n)
#define dec(i,n,a) for(int i=n;i>=a;i--)///[n,a]
#define pb push_back
#define fi first
#define se second
#define IO ios::sync_with_stdio(false)
#define fre freopen("in.txt","r",stdin)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
typedef unsigned long long ull;
const double PI=acos(-1.0);
const double E=2.718281828459045;
const double eps=1e-3;
const int INF=0x3f3f3f3f;
const int MOD=1e8+7;
const int N=1e3+5;
const ll maxn=1e6+5;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1};
bool vis[N];
int par[N];
int par_num[N];
vector<int>g[N];
int Find(int x)
{
return par[x]==x?x:(par[x]=Find(par[x]));
}
bool unite(int u,int v)
{
int fau=Find(u);
int fav=Find(v);
if(fau!=fav)
{
par[fav]=fau;
return true;
}
return false;
}
void init()
{
for(int i=1; i<=1000; i++)
{
par[i]=i;
vis[i]=0;
par_num[i]=0;
}
}
int a[N];
int main()
{
int n;
init();
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int k,u,v;
scanf("%d:%d",&k,&u);
a[i]=u;
while(--k)
{
scanf("%d",&v);
unite(u,v);
}
}
for(int i=1;i<=n;i++)
{
int pa=Find(a[i]);
par_num[pa]++;
}
vector<int>vec;
int ans=0;
for(int i=1; i<=1000; i++)
{
if(par_num[i])
{
ans++;
vec.pb(par_num[i]);
}
}
printf("%d\n",ans);
sort(vec.begin(),vec.end(),greater<int>());
bool flag=1;
for(auto x:vec)
{
if(flag) flag=0,printf("%d",x);
else printf(" %d",x);
}
puts("");
return 0;
}