PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索
题目分析:
一共有N个编号为1~1000的人,以及一共有编号为1~1000种不同的兴趣,在题目给出1~N编号的人员每个人喜欢的兴趣的id后,要求统计出不同的人员集合的个数以及每个人员几个的人数从大到小输出
注意点:
1.每个输入的人员id范围1~N,但是并不意味着兴趣的id也是1~N,完全有可能是大于N 小于等于1000的其他数
2.通过样例输出我们可以得知,如果有三个人喜欢的是(2,3)(3,5)(5,6)类似这样的三个人是归属一个集合的,换句话说只要某个人和另一个集合中的任何一个人有兴趣的交集,就可以加入这个集合,并不是要求集合中的所有人都要有至少一个的共同兴趣才行
3.在查询的时候避免人员id与兴趣id的混淆
题解:
这里我的方法是用两个vector数组,一个存放id为i的人员喜欢的兴趣的id,另一个存放id为i的兴趣所拥护者的id(我称喜欢i兴趣的人为i兴趣的拥护者),由于最后的答案是输出不同的集合数量以及每个集合的人数,这里我预先规定每个人员集合中有一个领导者,p[i]为id为i的人所属集合的领导者的id,在搜索合并集合之前,每个人都是独立的个体集合,我们的搜索通过dfs实现,出发点是每个人的id,通过查询编号为id的人所喜欢的所有的兴趣,然后进一步查询喜欢这个兴趣的所有人的id,而此时这些人都是和前者有交集的,则p[当前id]就是搜索的起始点的人员的id,然后我们继续查询此时这个人喜欢的兴趣,然后进一步查询这个兴趣所有的拥护者,这些拥护者p[i]也要赋值dfs最初的那个人的id......依次重复(这个过程通过代码的观察更为直观),要注意的是搜索的过程中需要不断将被搜到的新的人员记录下来,每次只深入搜索未搜过的点
当你将所有的人员通过p[i]分成一个一个的集合,每个用户p[i]为所属集合的领导者id后,无论是统计人数还是统计集合数都将迎刃而解
代码:
1 #include<iostream>
2 #include<stdio.h>
3 #include<vector>
4 #include<set>
5 #include<string.h>
6 #include<cmath>
7 #include<algorithm>
8 using namespace std;
9
10 const int N = 1005;
11 int p[N], n; //p[i]为i属于的集群的首领的id
12 int vis[N]; //i是否已经被分类
13 vector<int> v1[N]; //每个兴趣的拥护者id
14 vector<int> v2[N]; //每个人喜欢的兴趣id
15 int ans[N];
16
17 void dfs(int ori, int now, int type){
18 // printf("ori = %d now = %d type = %d\n", ori, now, type);
19 if(type == 2){
20 for(int i = 0; i < v2[now].size(); i++){
21 dfs(ori, v2[now][i], 1);
22 }
23 }else{
24 for(int i = 0; i < v1[now].size(); i++){
25 int t = v1[now][i];
26 if(vis[t] == 0){
27 vis[t] = 1;
28 p[t] = ori;
29 dfs(ori, t, 2);
30 }
31 }
32 }
33 }
34
35 bool cmp(int x, int y){
36 return x > y;
37 }
38
39 int main(){
40 memset(vis, 0, sizeof(vis));
41 scanf("%d", &n);
42 for(int i = 1; i <= n; i++){
43 int m;
44 scanf("%d:", &m);
45 for(int j = 1; j <= m; j++){
46 int x;
47 scanf("%d", &x);
48 v2[i].push_back(x);
49 v1[x].push_back(i);
50 }
51 }
52 for(int i = 1; i <= n; i++) p[i] = i; //每个人的管理者id 一个集群中所有人以其中一人id为id
53 for(int i = 1; i <= n; i++){
54 if(vis[i] == 0){
55 vis[i] = 1;
56 dfs(i, i, 2); //初始人员id 当前id 第三个变量为1则当前id为兴趣id,查拥护者
57 } // 为2则当前id为拥护者id 查拥护者喜欢的兴趣
58 }
59 int sum = 0;
60 memset(ans, 0, sizeof(ans));
61 for(int i = n; i >= 1; i--){
62 if(p[i] == i){
63 sum++;
64 }
65 ans[p[i]]++;
66 }
67 sort(ans+1, ans+n+1, cmp);
68 printf("%d\n", sum);
69 for(int i = 1; i <= sum; i++){
70 if(i != 1) printf(" ");
71 printf("%d", ans[i]);
72 }
73 printf("\n");
74 return 0;
75 }
PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索的更多相关文章
- PAT 天梯赛 是否同一棵二叉搜索树 (25分)(二叉搜索树 指针)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- PAT 天梯赛 L3-003. 社交集群 【并查集】
题目链接 https://www.patest.cn/contests/gplt/L3-003 思路 并查集 用一个 cou[i] 来表示 第 i 门课程 的第一个 感兴趣的人 并的时候 判断 cou ...
- PAT天梯赛练习题——L3-003. 社交集群(并查集按秩合并)
L3-003. 社交集群 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在社交网络平台注册时,用户通常会输入自己的兴趣爱好, ...
- 【PTA 天梯赛】L3-003 社交集群(并查集)
当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友.一个“社交集群”是指部分兴趣爱好相同的人的集合.你需要找出所有的社交集群. 输入格式: 输入在第一行 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
- L3-003. 社交集群(并查集)
L3-003. 社交集群 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在社交网络平台注册时,用户通常会输入自己的兴趣爱好, ...
- L2-2 社交集群 (25 分)(一个写挫的并查集)
题目: 思路: 就是一个并查集的裸题,不过在数据查找方面可能不好处理,暴力完全可以解决这个问题啊!! #include <bits/stdc++.h> #include <cstdi ...
- PAT天梯赛 L1-049 天梯赛座位分配
题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...
- PAT天梯赛L3-007 天梯地图
题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...
随机推荐
- Pytest 系列(27)- allure 命令行参数
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 先看看 allure 命令的帮助文 ...
- Unity 黑暗之光 笔记 第三章
第三章 角色控制 1.创建游戏运行场景并导入素材资源 2.创建和管理标签 1 //const 表明这个是一个共有的不可变的变量 2 public const string ground = &qu ...
- 3分钟快速搞懂Java的桥接方法
什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥 ...
- 免杀shellcode并绕过杀毒添加自启动
https://www.wtfsec.org/posts/%E5%85%8D%E6%9D%80shellcode%E5%B9%B6%E7%BB%95%E8%BF%87%E6%9D%80%E6%AF%9 ...
- 点击劫持(Iframe clickJack)练习
实验内容: 寻找一个合适的网站放入到iframe标签中.实验中测试了包括知网首页及登录界面.淘宝首页及登录界面,百度首页,微信下载界面.发现淘宝登录界面无法放入,会直接跳转到淘宝真实的登录界面,其他的 ...
- 详述网络中ARP安全的综合功能
组网图形 ARP安全简介 ARP(Address Resolution Protocol)安全是针对ARP攻击的一种安全特性,它通过一系列对ARP表项学习和ARP报文处理的限制.检查等措施来保证网络设 ...
- 【终极版】利用阿里云云解析API实现动态域名解析(ddns),搭建私有服务器【含可执行文件和源码】
前言:懒人可以直接往下看,有代码和全部资源可以下载.此文章是先前文章的定时版,主要是添加了定时执行的功能,并且将代码中的配置项放置到了app.config文件中,方便不懂开发的朋友修改使用.未经许可请 ...
- Prometheus从入门到精通:一、部署
一.Prometheus是什么? prometheus是一个开源指标监控解决方案,指标就是指的CPU的使用率.内存使用率等数据. 二.Prometheus的架构 这里直接粘贴官网的架构图: 三.安装 ...
- SpringBoot进阶教程(六十八)Sentinel实现限流降级
前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...
- 【译】JWT(JSON Web Token) 入门指南
JWT 入门指南 原文地址:https://blog.angular-university.io/angular-jwt/ 这篇文章是两篇手把手教你如何在Angular应用(也适用于企业级应用)中实现 ...