1107.Social Clusters

题目描述

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 : hi[1] hi[2] ... hi[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

考点

并查集

思路

并查集中存储的依然是人的编号,用course[h]表示任意一个喜欢h活动的人的编号。

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> parent, isRoot;
int cmp1(int a, int b) { return a > b; }
int find(int x) {
    int a = x;
    while (x != parent[x]) x = parent[x];
    while (a != parent[a]) {
        int z = a;
        a = parent[a];
        parent[z] = x;
    }
    return x;
}
void toUnion(int x1, int x2) {
    int r1 = find(x1), r2 = find(x2);
    if (r1 != r2) parent[r1] = r2;
}
int main() {
    int n, i, j, k, h, f, sum = 0;
    int course[1001] = { 0 };
    cin >> n;
    parent.resize(n+1);
    isRoot.resize(n+1);
    for (i = 1; i <= n; i++) parent[i] = i;
    for (i = 1; i <= n; i++) {
        scanf("%d:", &k); 
        for (j = 0; j < k; j++) {
            cin >> h;
            if (course[h] == 0)
                course[h] = i;
            toUnion(i, find(course[h]));
        }
    }
    for (i = 1; i <= n; i++) isRoot[find(i)]++;
    for (i = 1; i <= n; i++) if (isRoot[i] != 0)sum++;
    cout << sum << endl;
    sort(isRoot.begin(), isRoot.end(), cmp1);
    for (i = 0; i < sum; i++) cout << isRoot[i] << (i == sum-1 ? "" : " ");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,486评论 0 10
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 10,066评论 0 23
  • 饭桌上和朋友闲聊,她说她儿子最近特别爱吹牛,听听小孩子的牛皮。 豆豆:父母上班,奶奶接送他。牛牛:爸爸上班,妈妈全...
    东风满树花阅读 688评论 4 23
  • 我记得有位顾客和我分享了一个故事,主人公是她的老板娘,虽然不能说算是富婆,但也不差钱,这位老板人道中年,满脸沧桑,...
    晴空育儿说888阅读 339评论 0 2
  • 我们常说,目标决定开端,心态决定成败。也就是有什么样的心态就有什么样的行为,什么样的行为就决定是什么样的结果。由此...
    唐春荣阅读 362评论 0 0