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
 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int cnt[] = {,}, father[], hobby[] = {,};
int N;
int findFather(int x){
int a = x;
while(father[x] != x){
x = father[x];
}
while(a != x){
int temp = a[father];
a[father] = x;
a = temp;
}
return x;
}
void union_(int a, int b){ //a集合的根节点不变
int tempa = findFather(a);
int tempb = findFather(b);
if(tempa != tempb){
father[tempb] = a;
}
}
bool cmp(int a, int b){
return a > b;
}
int main(){
int N;
scanf("%d", &N);
for(int i = ; i <= N; i++){
father[i] = i;
}
for(int i = ; i <= N; i++){
int num, temp;
scanf("%d:", &num);
for(int j = ; j < num; j++){
scanf("%d", &temp);
if(hobby[temp] == ){
hobby[temp] = i;
}else{
union_(hobby[temp], i);
}
}
}
for(int i = ; i <= N; i++){
int root = findFather(i);
cnt[root]++;
}
int ans = ;
for(int i = ; i <= N; i++){
if(cnt[i] != )
ans++;
}
sort(cnt, cnt + N + , cmp);
printf("%d\n%d", ans, cnt[]);
int k = ;
while(k < N && cnt[k] != ){
printf(" %d", cnt[k]);
k++;
}
cin >> N;
return ;
}

总结:

1、题意:看了书上的解释才搞明白这道题什么意思。并不是说一个set里的所有人都要有共同的hobby,而是当两个人有至少一个共同hobby时,他们就处于一个set。比如A的hobby是1、2,B的hobby是2、3,则AB在一个set中。而C的hobby是3、4,则B、C在一个set中。AB同set,BC同set,则ABC同属一个set。其实就是考并查集。

2、并查集的要点:

  • father[a] = b,表示a的父节点是b。若father[i] = i,则i是根节点。 初始化时,每个节点都初始化为根节点。
  • 查找根节点:当x != father[x] 时,不断进行x = father[x] 的操作即可。
  • 合并:为防止出现环路,只能对不同的集合做合并所以合并a、b时,先找到a的根节点roota, b的根节点rootb,如果roota != rootb, 则 father[rootb] = roota。严格按这个流程做可以避免出错。不要仅仅把b的父亲设为roota。
  • 路径压缩:为了降低查找的复杂度。可以放在查找根节点的函数中,当找到 x 的根节点 root 时,再从 x 往根节点回溯一次,沿途所有节点的父节点均设置为 root。

3、只有两个人有共同hobby才将他们所在的两个set做合并,但如果对每个人保存一个hobby列表,然后每两个人检查是否有共同爱好会很费时。可以设置一个hobby数组,hobby[i]仅仅记录一个人,就是首个读入的有这个爱好的人,并将这个人作为他所在set的root节点一直不变。

A1107. Social Clusters的更多相关文章

  1. PAT A1107 Social Clusters (30 分)——并查集

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

  2. PAT甲级——A1107 Social Clusters

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

  3. PAT_A1107#Social Clusters

    Source: PAT A1107 Social Clusters (30 分) Description: When register on a social network, you are alw ...

  4. PAT1107:Social Clusters

    1107. Social Clusters (30) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue When ...

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

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

  6. 1107 Social Clusters[并查集][难]

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

  7. PAT甲级1107. Social Clusters

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

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

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

  9. PAT-1107 Social Clusters (30 分) 并查集模板

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

随机推荐

  1. Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置

    用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...

  2. Canvas & SVG

    Canvas & SVG https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-dev ...

  3. 莫烦sklearn学习自修第九天【过拟合问题处理】

    1. 过拟合问题可以通过调整机器学习的参数来完成,比如sklearn中通过调节gamma参数,将训练损失和测试损失降到最低 2. 代码实现(显示gamma参数对训练损失和测试损失的影响) from _ ...

  4. SQL Server 2008 开启远程连接

    除了 IP1.IP2 外,也要把 IPALL 的端口也设置为 1433 参考:SQL Server开启1433端口,彻底解决方案

  5. Vue学习目录

    前面的话 近年来,前端框架发展火热,新的框架和名词不停地出现在开发者眼前,而且开发模式也产生了一定的变化.目前来看,前端MVVM框架的出现给开发者带来了不小的便利,其中的代表就有Angular.js. ...

  6. iPhone

    电报交流***vpnpay app不能用了,只要能下载就可以用,谨慎卸载 升级.网络链接不成功的,多试几次,毕竟程序不会运行你的错误操作 ,重新添加链接服务器,继续搞!耐心的进行下面操作即可链接,如有 ...

  7. IntelliJ IDEA通过Tomcat启动项目过程分析

    Tomcat部署项目的多种方式 Tomcat安装目录:${TOMCAT_HOME} 1.常规的webapps下直接部署到${TOMCAT_HOME}/webapps下 2.利用控制台进行部署 3.外部 ...

  8. 洛谷P1897电梯里的爱情题解

    题目 这个题是一个搜索题,可以先算出最高楼层,并算出不重复的楼层的个数,要注意的一点就是一定不要把0楼算在内. 代码 #include<iostream> #include<cstr ...

  9. 如何让自己定义的memory使用fpga自带的memory资源

    前言 本文解决方法来源: http://quartushelp.altera.com/13.1/mergedProjects/hdl/vlog/vlog_file_dir_ram.htm 如果你自己V ...

  10. pycharm opencv4.0安装使用

    pycharm+opencv4.0 还记得去年冬天装了两回opencv3,每次都搞得死去活来的.. 今天也是查了一上午,什么anaconda,vs,但是我是在pycharm的虚拟环境中安装,突然看到一 ...