某学校有N个学生,形成M个俱乐部。每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈。一个学生可以同时属于若干个不同的俱乐部。根据“我的朋友的朋友也是我的朋友”这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友。请编写程序计算最大朋友圈中有多少人。

输入格式:
输入的第一行包含两个正整数N(≤30000)和M(≤1000),分别代表学校的学生总数和俱乐部的个数。后面的M行每行按以下格式给出1个俱乐部的信息,其中学生从1~N编号:
第i个俱乐部的人数Mi(空格)学生1(空格)学生2 … 学生Mi

输出格式:
输出给出一个整数,表示在最大朋友圈中有多少人。


题目思路:
主要考察了并查集的知识点,把每个朋友圈原本独立的人合并到一棵树上,也就是建成了每个人的人际关系网,每当有新的人加入进来,将这个人的人际关系网也加入进来,寻找人数最多的人际关系网就是这道题的本意。其中的unite函数我给了一个简单版本的(效率低)和稍微复杂一点的(效率高),如果有耐心就将两个慢慢看,旁边也有解析,不懂得评论区问我,我会及时回复。另外,关于“并查集”这种数据结构的学习有一位大牛的文章大家可以参考一下。并查集。希望这篇文章对你起到一点帮助。

#include<iostream>
using namespace std;
const int MAXN = 30000;
int pre[MAXN], sum[MAXN], ranking[MAXN], ar[1000];void Initialise(int n);
int find(int x);
void Unite(int x, int y);
//增加ranking的优化算法
int main()
{int n, m;cin >> n >> m;Initialise(n);int t;while (m--){cin >> t;for (int i = 1; i <= t; i++){cin >> ar[i];}for (int i = 1; i <= t; i++){for (int j = i + 1; j <= t; j++)Unite(ar[i], ar[j]); //对每一个朋友圈里的任意两个人并在一起}}int maxn = 0;for (int i = 1; i <= n; i++) //常规找最大值{if (sum[i] > maxn)maxn = sum[i];}cout << maxn;return 0;
}
void Initialise(int n)
{for (int i = 1; i <= n; i++){pre[i] = i;           //初始化为每个人的上级都是自己sum[i] = 1;            //每个人都是一个朋友圈(仔细想想),人数起初只有一个人ranking[i] = 1;     //高度也都是1}
}
int find(int x)
{if (pre[x] == x)     //递归出口return x;elsereturn pre[x] = find(pre[x]);   //如果查找的x不是根,那么通过递归认为直接把“根”找到并赋给pre[x]
}void Unite(int x, int y)       //这是效率比较低的算法
{int x_root = find(x);int y_root = find(y);if (x_root != y_root){pre[x_root] = y_root;sum[y_root] += sum[x_root];}
}void Unite(int x, int y)       //这是优化过的算法
{int x_root = find(x);int y_root = find(y);               //找到二者的根if (x_root == y_root)return;      //如果在同一颗树上就不需要进一步操作了if (ranking[x_root] < ranking[y_root])   //当x_root高度小于y_root{pre[x_root] = y_root;              //那么让y_root作为x_root的根sum[y_root] += sum[x_root];          //把x_root的朋友圈并到y_root的朋友圈中}else{if (ranking[x_root] == ranking[y_root])ranking[x_root]++;//如果x_root与y_root的高度相同,//二者均可为对方的根,为了统一操作,这里应当让x_root为根(简单想想)pre[y_root] = x_root;               //让x_root作为y_root的根;sum[x_root] += sum[y_root];            //把y_root的朋友圈并到x_root的朋友圈中}}

案例4-3 朋友圈 (25 分)(并查集)相关推荐

  1. 7-25 朋友圈 (25 分)(详解+并查集的了解和应用)

    一:题目 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个 ...

  2. java并查集找朋友圈_图—并查集(解决朋友圈问题)

    图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构.图可以分为两种,无向图和有向图. ★图的定义: ★典型问题: 利用图能够解决很多问题,这里有一个较为典型的问题,假如已知有n个人和 ...

  3. 朋友圈问题(并查集)

    问题描述: 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写出程序求出这n个人里一共有多少朋友圈. 例如:n=5, ...

  4. 案例6-1.5 旅游规划 (25 分)邻接表实现

    案例6-1.5 旅游规划 (25 分) 用邻接表实现Dijkstra算法 这题一开始做的时候没想到用邻接数组做,所以就用的链表. 总的来说还是Dijkstra算法,只不过是存储方式的问题罢了,我用了四 ...

  5. 【解析】案例4-1.7 文件传输 (25 分)

    立志用最少的代码做最高效的表达 当两台计算机双向连通的时候,文件是可以在两台机器间传输的.给定一套计算机网络,请你判断任意两台指定的计算机之间能否传输文件? 输入格式: 首先在第一行给出网络中计算机的 ...

  6. 案例4-1.6 树种统计 (25 分)_18行代码AC

    立志用最少的代码做最高效的表达 随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(≤ ...

  7. 案例7-1.3 寻找大富翁 (25分)

    胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式: 输入首先给出两个正整数N(≤10 ​6 ...

  8. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  9. PAT A 1118. Birds in Forest (25)【并查集】

    并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...

  10. 【天梯赛】单词长度、社交网络图中结点的“重要性”计算、朋友圈、家谱处理、狼人杀

    1.单词长度 单词长度 #include<bits/stdc++.h> using namespace std; const int N=2e8+10; string s; int fla ...

最新文章

  1. 小型直流电机内部结构
  2. linux c 线程的创建、线程等待、线程终止、线程分离
  3. 商城项目使用到的主要技术分析
  4. C语言基本语法——函数
  5. python基础学习笔记——方法返回值
  6. MFC源码解读(一)最原始一个MFC程序,手写不用向导
  7. TortoiseGit使用入门
  8. (软考信息安全工程师--中级)二、网络攻击原理与常用方法
  9. 最强整理!Android攒了一个月的面试题及解答,震撼来袭免费下载!
  10. 笔耕不辍 | Redis入门
  11. 设置idea的ant工具的代理
  12. 使用Arduino IED配合Blinker为ESP8266-01s烧写程序
  13. 121. 买卖股票的最佳时机_面试题63. 股票的最大利润_[找出数组中一个元素和它后面最大的元素的差值]
  14. 神奇的「种子法则」:意念具有不可思议的超能量
  15. svn查看ip linux,查看svn服务器的ip地址
  16. Linux ——Shell编程---以后补全
  17. 一名普通cs本科生的自述—【大学到底怎么过才值?】
  18. VS2019显示错误未定义标识符delay
  19. 使用图神经网络预测药物-药物相互作用
  20. 第二届全国高校计算机能力挑战赛-Java程序设计赛

热门文章

  1. 创新的垃圾处理模式——赛普利
  2. SqlCacheDependency 实现数据缓存
  3. VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/cpuid.c:376 bugNr=1036521
  4. java Sting类函数
  5. shell单引号、双引号、反引号、无引号的区别
  6. python tornade 模板扩展
  7. Android内存泄漏(转)
  8. iptables 简介
  9. 一个“新生代”白帽的自我修养
  10. Dockerfile best practices