首页 > 其他分享 >1107 Social Clusters

1107 Social Clusters

时间:2023-05-31 11:25:04浏览次数:42  
标签:index hobby int father findFather 1107 Social Clusters include

题目:

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

题目大意:有n个人,每个人喜欢k个活动,如果两个人有任意一个活动相同,就称为他们处于同一个社交网络。求这n个人一共形成了多少个社交网络

心得:本题是对n个人划分网络,因此并查集的范围应当选择人而不是活动,从而能够更加方便地求出每个社交网络中的人数。

 

代码:(优化前)

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
int father[1005], hobby[1005], clunum[1005]={0};
bool flag[1005];
using namespace std;
int findFather(int x){
    while(x != father[x]){
        x = father[x];
    }
    return x;
}
void Union(int x, int y){
    int faX = findFather(x);
    int faY = findFather(y);
    if(faX != faY){
        father[faX] = faY;
    }
}
int main(){
    int n, mx = -1;
    for(int i = 1; i <=1000; i++){
        father[i] = i;
    }
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        string Num;
        cin>>Num;
        int num = Num[0] - '0';
        int pre;
        for(int j = 0; j < num; j++){
            int index;
            cin>>index;
            if(j == 0) hobby[i] = index;
            flag[index] = 1;
            if(j != 0){
                 Union(index, pre);
            }
            pre = index;
        }
    }
    int ans = 0;
    vector<int> cluster;
    for(int i = 1; i <= 1000; i++){
        if(father[i] == i && flag[i] == 1){
            ans++;
            cluster.push_back(i);
        }
    }
    cout<<ans<<endl;
    int w = 0;
    for(int i = cluster.size() - 1; i >= 0; i--){
        int sum = 0;
        for(int j = 1; j <= n; j++){
            int faJ = findFather(hobby[j]);
            if(faJ == cluster[i]){
                sum++;
            }
        }
        clunum[w++] = sum;
    }
    sort(clunum, clunum + w, greater<int>() );
    for(int i = 0; i < w; i++){
        if(i > 0) printf(" ");
        printf("%d", clunum[i]);
    }
    return 0;
}

 

代码:(优化后)

#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){
    while(x != father[x]){
        x = father[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 = 0;
    int course[1001] = {0};
    scanf("%d", &n);
    father.resize(n + 1);
    isRoot.resize(n + 1);
    for(int i = 1; i <= n; i++)
        father[i] = i;
    for(int i = 1; i <= n; i++) {
        scanf("%d:", &k);
        for(int j = 0; j < k; j++) {
            scanf("%d", &t);
            if(course[t] == 0)
                course[t] = i;
            Union(i, findFather(course[t]));
        }
    }
    for(int i = 1; i <= n; i++)
        isRoot[findFather(i)]++;
    for(int i = 1; i <= n; i++) {
        if(isRoot[i] != 0)
            cnt++;
    }
    printf("%d\n", cnt);
    sort(isRoot.begin(), isRoot.end(), cmp1);
    for(int i = 0; i < cnt; i++) {
        printf("%d", isRoot[i]);
        if(i != cnt - 1) printf(" ");
    }
    return 0;
}

 

标签:index,hobby,int,father,findFather,1107,Social,Clusters,include
From: https://www.cnblogs.com/yccy/p/17445539.html

相关文章

  • CodeForces 1107B Digital root(找规律)
    传送门每个数字都有个数位和,就是把数字的每一位相加直到数位和是一个个位数。然后题目就要你求第K个数位和为X的数字是多少。写一些数字出来就很容易发现规律了可以看出每一竖列的数位和是相等的,然后就找到规律是9*(k-1)+x,注意数据范围是1e12,是longlong,然后就这么多,就可以直......
  • CodeForces 1107A Digits Sequence Dividing(思维)
    传送门唉,题目讲的天花乱坠的,花里胡哨,一上来真是把我唬住了。愣了半天也没看出来到底咋做,后来借助翻译明白了这个题就是让你把一串字符分成两串,然后第一串要比第二串小,就这样,然后又是个SpecialJudge。做的时候就把第一个数作为第一个串,然后串长如果为2,就判断一下后面的串要比第一个......
  • 论文阅读笔记《Training Socially Engaging Robots Modeling Backchannel Behaviors w
    TrainingSociallyEngagingRobotsModelingBackchannelBehaviorswithBatchReinforcementLearning训练社交机器人:使用批量强化学习对反馈信号行为进行建模发表于TAC2022。HussainN,ErzinE,SezginTM,etal.TrainingSociallyEngagingRobots:ModelingBackc......
  • Codeforces [Hello 2020] 1284F New Year and Social Network(图论匹配推理+lct)
    https://codeforces.com/contest/1284/problem/F题目大意:有两个大小为n的树T1和T2.T2中的每条边(u,v)可以匹配T1中u到v路径上的所有边。求最大匹配,并给出方案。\(1<=n<=250000\)题解:首先你需要观察样例大胆猜想一定有完美匹配。考虑T1中的一个叶子x和它的父亲y。显然的是,从T2中随......
  • UVA11107 Life Forms
    怎么没有正常的后缀数组二分的题解啊给定\(n\)个字符串,求出最长的,在多于\(\left\lfloor\frac{n}{2}\right\rfloor\)个字符串中出现的子串,并按照字典序从小到大输出。\(n\leq100\),\(|S|\leq1000\),根据套路可以将所有字符串连成一个,不同的字符串用特殊符号隔开,然后建出新......
  • Vulnhub之 BoredHackerBlog: Social Network 2.0靶机详细测试过程
    Socnet作者:jasonhuawen靶机信息名称:BoredHackerBlog:SocialNetwork2.0地址:https://www.vulnhub.com/entry/boredhackerblog-social-network-20,455/识别目标主机IP地址(kali㉿kali)-[~/Desktop/Vulnhub/Socnet]└─$sudonetdiscover-ieth1-r192.168.56.0/24Cu......
  • PAT Basic 1107. 老鼠爱大米
    PATBasic1107.老鼠爱大米1.题目描述:翁恺老师曾经设计过一款Java挑战游戏,叫“老鼠爱大米”(或许因为他的外号叫“胖胖鼠”)。每个玩家用Java代码控制一只鼠,目标是抢吃尽可能多的大米让自己变成胖胖鼠,最胖的那只就是冠军。因为游戏时间不能太长,我们把玩家分成\(N\)组,每组......
  • Add Again UVA - 11076
     defineS,itissumofallpossiblepermutationsofagivensetofdigits.Forexample,ifthedigitsare<123>,thensixpossiblepermutationsare<123>,<132>,<213>,<231>,<312>,<321>andthesumofthemis......
  • 力扣1107(MySQL)-每日新用户统计(中等)
    题目:Traffic表:该表没有主键,它可能有重复的行。activity列是ENUM类型,可能取(‘login’,‘logout’,‘jobs’,‘groups’,‘homepage’)几个值之一。问题编写一个SQL查询,以查询从今天起最多90天内,每个日期该日期首次登录的用户数。假设今天是2019-06-30.示例Tr......
  • 1107: ZN的随机数
    题目描述ZN想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请......