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. Zookeeper安装和配置详解

    http://coolxing.iteye.com/blog/1871009 Zookeeper是什么 http://www.cnblogs.com/yuyijq/p/3391945.html Zoo ...

  2. ASIHttpRequest封装

    ASIHttpRequest是一个非常好的库,只是直接使用稍嫌麻烦,以下就尝试来封装一下吧. 思路:每次请求时,须要创建一个ASIHttpRequest对象,设置它的属性(url,delegate.p ...

  3. 面向对象----构造方法、this 关键字、函数的参数传递、package语句/import语句

    构造方法 构造器的定义.作用 构造方法的特征 它具有与类相同的名称:它不含返回值: 注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动 ...

  4. 测试用例和BUG描述规范

    欢迎关注我的公众号,了解更多的测试知识:[软件测试经验与教训] 一一BUG描述基础知识 Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题 ...

  5. array_diff 不注意的坑

    1)array_diff 是对比两个(或以上数组)的值的差集,注意是对比数组的值,和数组的键无关 2)是以第一个数组为对比对象,找上在第一个数组里有但其他数组里没有的值(可以同值但不同键的多个) 举个 ...

  6. centos无法联网解决方法

    1)进入 /etc/sysconfig/network-scripts/ 2)vi 或 vim 打开 ifcfg-eth0(不一定是eth0,这个自己判断了) 3)将 ONBOOT=no 改成 ONB ...

  7. shell基础篇(三)--引号

    ---今天篇幅比较少:只介绍引号. shell中的引号有三种:双引号",单引号',反引号`1. 双引号:由双引号括起来的字符,除$.倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作 ...

  8. thinkjs——两表联查

    问题来源: 现有一张texture以及一张tradename表,两者的联系是texture表中有一字段名为tid对应tradename表中的id,而tradename表中却有一字段type,要求根据t ...

  9. Bettercap的安装和使用嗅探WIFI

    一.首先安装bettercap 我这里的环境是ubuntu 16.04 apt-get install build-essential ruby-dev libpcap-dev git ruby ge ...

  10. java 中的String类型数据添加双引号

    转义符 \ 加上引号   \" <?xml version="1.0"encoding="GBK"?> String temp = &qu ...