当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。
输入格式:
输入在第一行给出一个正整数 N(≤1000),为社交网络平台注册的所有用户的人数。于是这些人从 1 到 N 编号。随后 N 行,每行按以下格式给出一个人的兴趣爱好列表:
Ki: hi[1] hi[2] ... hi[Ki]
其中Ki(>0)是兴趣爱好的个数,hi[j]是第j个兴趣爱好的编号,为区间 [1, 1000] 内的整数。
输出格式:
首先在一行中输出不同的社交集群的个数。随后第二行按非增序输出每个集群中的人数。数字间以一个空格分隔,行末不得有多余空格。
输入样例:
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
代码长度限制
16 KB
时间限制
3000 ms
内存限制
64 MB
思路:这里用了集合遍历判断是否有相同的,有的话就归一下,没有就另建一个,这里骗了20分,有空再用并查集搞一下直接上分。 此处先留个坑。
#include "bits/stdc++.h"
using namespace std;
const int N = 1010;
set<int> s[1001];
int arr[N], ann[N];
int k = 1;
vector<int> w;
void find(int arr[], int n){
int flag = 0;
if(k == 1){
for(int p = 0; p < n; p ++)
{
s[k].insert(arr[p]);
// cout<<arr[p]<<" ";
}
// cout<<endl;
ann[k] ++;
k ++;
return;
}
for(int i = 1; i < k ; i ++){
for(int p = 0; p < n; p ++){
//很巧妙的在判断的时候就创建新集合
for(auto j : s[i]){
if(arr[p] == j){
flag = i;
break;
}
}
if(flag)break;
}
if(flag)break;
}
if(flag) {
ann[flag] ++;
s[k].clear();
k --;
// cout<<flag<<"%%"<<endl;
for(int p = 0; p < n; p ++){
// cout<<arr[p]<<" ";
s[flag].insert(arr[p]);
}
// cout<<s[flag].size()<<"&&"<<endl;
// cout<<endl;
}
else {
ann[k] ++;
for(int p = 0; p < n; p ++)
s[k].insert(arr[p]);
}
k ++;
}
int main(){
int n, a;
cin>>n;
while(n--){
int m;
char c;
cin>>m>>c;
for(int i = 0; i < m; i ++){
cin>>arr[i];
// cout<<arr[i]<<" ";
}find(arr, m);
}
cout<<k - 1<<endl;
for(int i = 1; i < k; i ++){
// cout<<ann[i]<<" ";
w.push_back(ann[i]);
}
// cout<<endl;
sort(w.begin(), w.end());
for(int i = w.size() - 1; i >=0; i -- ){
cout<<w[i];
if(i != 0) cout<<" ";
}
return 0;
}