PAT 甲级 刷题日记|A 1107 Social Clusters (30 分)

单词积累

specify:指定 详细说明 列举

题目

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 
using namespace std;

const int maxn = 10000 + 5;
int father[maxn];
int hobbies[maxn];
int numbers[maxn];
vector num;
int n;

void inital() {
    for (int i = 0; i <= maxn; i++) {
        father[i] = i;
        numbers[i] = 1;
        hobbies[i] = 0;
    }
}

int findfather(int x) {
    while (x != father[x]) {
        x = father[x];
    }
    return x;
}

void Union(int a, int b) {
    int x = findfather(a);
    int y = findfather(b);
    if (x == y) return;
    father[y] = x;
    numbers[x] += numbers[y];
    return ;
}

int main() {
    inital();
    cin>>n;
    int k;
    for (int i = 1; i <= n; i++) {
        scanf("%d:", &k);
        int h;
        for (int j = 0; j < k; j++) {
            cin>>h;
            if(hobbies[h] == 0) hobbies[h] = i;
            else Union(i, hobbies[h]);
        }
    }

    int clu = 0;
    for (int i = 1; i <= n; i++) {
        if (father[i] == i) {
            clu++;
            num.push_back(numbers[i]);
        }
    }
    sort(num.begin(), num.end());
    cout<= 0; i--) {
        cout<

你可能感兴趣的:(PAT 甲级 刷题日记|A 1107 Social Clusters (30 分))