1107 Social Clusters(30 分)

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:

K​i​​: h​i​​[1] h​i​​[2] ... h​i​​[K​i​​]

where K​i​​ (>0) is the number of hobbies, and h​i​​[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

题目大意:根据输入将用户分堆,也就是并查集的题目;输入格式:一共几个人,第几个人一共有几个爱好:爱好序号。根据兴趣爱好进行分堆,看哪些人在一起了,并按人数非升序排列。

//题目中给的样例共有3个簇,最大的4个人包括 2,4,6,8四个人,3个人的包括3,5,7三个人,这种没有重复,但是有没有可能会重复呢?

//我能想到的就是创建1000个向量,每个用户分别push,然后求出来长度!=1的向量,然后按照长度大小输出,其他没什么想法了。。。

代码来自:https://www.liuchuo.net/archives/2183

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> father, isRoot;
int cmp1(int a, int b){return a > b;}
int findFather(int x) {
int a = x;
while(x != father[x])//先找到整棵树的根节点。
x = father[x];
while(a != father[a]) {//找父亲的时候顺便将其高度变短,父节点都变为根节点了。
int z = a;//你学过的!变成两层高的。
a = father[a];
father[z] = x;
}
return x;
}
void Union(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB) father[faA] = faB;
}
int main() {
int n, k, t, cnt = ;
int course[] = {};
scanf("%d", &n);
father.resize(n + );
isRoot.resize(n + );
for(int i = ; i <= n; i++)
father[i] = i;
for(int i = ; i <= n; i++) {
scanf("%d:", &k);
for(int j = ; j < k; j++) {
scanf("%d", &t);
if(course[t] == )
course[t] = i;//也就是将这个课程归并为i所有。
Union(i, findFather(course[t]));//找到这个课程的父亲,因为两者有相同的父亲,
//此处应该findFather(course[t])是父亲的,因为其是course的编号。
//是一个簇内的,那么合并即可。
}
}
for(int i = ; i <= n; i++)
isRoot[findFather(i)]++;//那些是根节点的都++;最终求出来的是簇内所含的人数。
for(int i = ; i <= n; i++) {
if(isRoot[i] != ) cnt++;
}
printf("%d\n", cnt);
sort(isRoot.begin(), isRoot.end(), cmp1);
for(int i = ; i < cnt; i++) {
printf("%d", isRoot[i]);
if(i != cnt - ) printf(" ");
}
return ;
}

//真的太神奇了。

1.couser[i]表示爱好i第一次出现时的用户编号,如果=0表示这个爱好没出现。

2.如果新来了一个人k爱好也为i,那么将couser[i]和Kunion即可。

3.复习了并查集,并查集三要素:findFather+union+初始化father数组为自己;

4.这里使用了一个for循环遍历来确定每个簇有多少个人。

1107 Social Clusters[并查集][难]的更多相关文章

  1. PAT甲级——1107 Social Clusters (并查集)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90409731 1107 Social Clusters (30  ...

  2. [并查集] 1107. Social Clusters (30)

    1107. Social Clusters (30) When register on a social network, you are always asked to specify your h ...

  3. PAT甲级1107. Social Clusters

    PAT甲级1107. Social Clusters 题意: 当在社交网络上注册时,您总是被要求指定您的爱好,以便找到一些具有相同兴趣的潜在朋友.一个"社会群体"是一群拥有一些共同 ...

  4. 1107 Social Clusters——PAT甲级真题

    1107 Social Clusters When register on a social network, you are always asked to specify your hobbies ...

  5. PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)

    题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...

  6. 1107 Social Clusters (30 分)(并查集)

    并查集的基本应用 #include<bits/stdc++.h> using namespace std; ; vector<int>vec[N]; int p[N]; con ...

  7. 1107 Social Clusters (30)(30 分)

    When register on a social network, you are always asked to specify your hobbies in order to find som ...

  8. pat甲级 1107. Social Clusters (30)

    When register on a social network, you are always asked to specify your hobbies in order to find som ...

  9. PAT 1107 Social Clusters

    When register on a social network, you are always asked to specify your hobbies in order to find som ...

随机推荐

  1. OpenCV学习:体验ImageWatch

    Image Watch是在VS2012及以上版本上使用的一款OpenCV插件工具,能够实时显示图像和矩阵Mat的内容,跟Matlab很像,方便程序调试,相当好用. 1)安装Visual Studio ...

  2. htaccess文件中RewriteRule 规则参数介绍

    .htaccess 文件 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d Rew ...

  3. mysql中如何在创建数据库的时候指定数据库的字符集?

    需求描述: 在创建DB的时候指定字符集. 操作过程: 1.使用create database语句创建数据库 mysql> create database if not exists test03 ...

  4. github前端资源

    摘要: 本文将分享我在github上常用的一些插件,可能在开发中你会用到它,希望能够帮助你! 前端技术总结 url  : https://github.com/JacksonTian/fks 简述: ...

  5. ros论坛

    ros:http://ros.gaitech.net/forum.php makefile:http://blog.csdn.net/shallnet/article/details/38070745 ...

  6. ASP工程文件(csproj)解读

    https://blog.csdn.net/austin_link/article/details/40596185 C#项目中都会有一个不起眼的文件,后缀名csproj,很多人都会忽视它.其实,这个 ...

  7. java总结(1)——java的特点

    之前学习java仅仅是单纯的学习,老师要求学习.所以就学习.可是没有细致考虑过java的一些特别之处,比方,我们为什么要学习java而不是其它的语言,它必定有选择它的特点.所以,从如今開始,仅仅有埋头 ...

  8. MYSQL IFNULL函数的使用

    IFNULL函数是MYSQL数据库中最重要的函数之一,下面就对该函数的使用方面进行分析,希望对您能够有所帮助. 下文对MYSQL IFNULL函数的使用进行了详细的叙述,供您参考学习,如果您在MYSQ ...

  9. 安装postgresql之后为什么找不到postgresql service

    没有正常启动 postgresql service.可以 在运行里面 输入 services.msc 找到 postgresql 的服务.启动他.或者也可以用postgres 自带的 工具pg_ctl ...

  10. 【ecshop】使用sql 清除测试数据

    操作方式:后台->数据库->sql查询   输入以下你想进行的操作 -- -- 清空会员有关数据: -- TRUNCATE TABLE `ecs_users` ; TRUNCATE TAB ...