小米的校招题:
朋友圈(25分)
假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。
最后请分析所写代码的时间、空间复杂度。评分会参考代码的正确性和效率。
C/C++:
int friends(int n , int m , int* r[]);

思路:此题可以用并查集来解决,并查集数组刚开始里面存的都是-1,把每个圈子看成一个树,把其非根结点的-1都加到根节点里面去,然后非根节点存上根节点的下标,这样遍历数组时,为负数的就是根,负几那个朋友圈就有几个人,那几个人就是存这个根下标的元素。
具体实现如下:

  1. #include<iostream>
  2. #include<cassert>
  3. using namespace std;
  4. int FindRoot(int *set,int child)
  5. {
  6. assert(set);
  7. while(set[child] >= 0)
  8. {
  9. child = set[child];
  10. }
  11. return child;
  12. }
  13. void Combine(int *set,int root1,int root2)
  14. {
  15. assert(set);
  16. set[root1] += set[root2];
  17. set[root2] = root1;
  18. }
  19. int FindFrinedsCircle(int n,int m,int r[][2])
  20. {
  21. assert(r);
  22. int *set = new int(n);
  23. memset(set,-1,sizeof(int)*n);
  24. for(int i = 0;i < m;++i)
  25. {
  26. int first = r[i][0];
  27. int second = r[i][1];
  28. int root1 = FindRoot(set,first);
  29. int root2 = FindRoot(set,second);
  30. if(root1 != root2)
  31. {
  32. Combine(set,root1,root2);
  33. }
  34. }
  35. int count = 0;
  36. for(int i = 0;i < n;++i)
  37. {
  38. if(set[i] < 0 )
  39. {
  40. count++;
  41. }
  42. }
  43. return count;
  44. }
  45. int main()
  46. {
  47. int r[][2] = {{1 , 2} , {2 , 3} , {4 , 5}};
  48. cout<<FindFrinedsCircle(5,3,r)<<endl;
  49. return 0;
  50. }

并查集(UnionFindSet)相关推荐

  1. 并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并

    并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并 并查集由一个整型数组和两个函数构成 1.数组pre[]:记录每个结点的前导结点(父节点),初始化为:pre[i]=i 2.函 ...

  2. 数据结构之并查集Union-Find Sets

    1.  概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 2.  基本操作 并查集 ...

  3. 并查集 Python实现

    1 # 并查集实现 2 class Node: 3 pass 4 5 class UnionFindSet: 6 def __init__(self, nodes): 7 self.fatherDic ...

  4. 算法练习day12——190331(并查集)

    1.并查集 1.1 简介 用于解决检查两个元素是否属于一个集合: 合并两个元素各自所在的集合: 即: isSameSet(A,B):其中A属于set1,B属于set2,看set1和set2是否为同一个 ...

  5. 并查集(Union Find Set)

    并查集(Union Find Set) 这篇文章我们来讲一下并查集,什么是并查集呢?来举一个形象的例子. 话说符文之地上居住着各式各样的英雄,他们效忠于自己的国家或部落,整天背着武器在外面执行任务,碰 ...

  6. 高级数据结构与算法 | 并查集(Union-Find)

    文章目录 并查集的原理 并查集的实现 例题 并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合.开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于同一组元素的集合合并 ...

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

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

  8. 算到怀疑人生!如何用并查集解决朋友圈个数问题?

    作者 |  channingbreeze 责编 | 郭芮 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 今天小史去了一家社交小巨头公司 ...

  9. [L氏并查集] Python 列表法实现非递归并查集,轻松权重优化。

    一般的并查集都是用递归或者新建一个类来实现,这里介绍一种用Python来实现的非递归非函数并查集,这个方法暂时未在其他地方见过,尤其是中文领域目前还未见过,很可能是搜索引擎无法搜索到正确内容的原因,所 ...

最新文章

  1. factory i/o下载_推荐 Dynalist.io 大纲笔记整理工具
  2. python 二叉树中所有距离为k的节点_leetcode 二叉树中所有距离为 K 的结点
  3. android 详解画图,android画图之贝塞尔曲线讲解详解
  4. 正确的线程中止-标志位
  5. 判断ShellExecute函数是否执行完一个程序的方法
  6. mysql-bin.000001文件的来源及处理方法
  7. 微信小程序 map 点击图标回到自己的位置(不使用controls控件)
  8. asp.net在线发送邮件,以前没做过,调试好了。
  9. Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库
  10. 2021年7月文章精选
  11. 为XNA制做安装程序(四)WIX Toolset 3.0 for Visual Studio 2008
  12. 编译用于高放射性环境的应用程序
  13. [zz]linux之sed用法
  14. java面向对象编程考试题_《Java面向对象程序设计》考试卷及答案带注释
  15. 第一课 矩阵的行图像与列图像(麻省理工公开课:线性代数)【转载】
  16. 计算机信息技术知识点思维导图,思维导图信息技术的学习方法
  17. php-后台权限的思路
  18. NI CompactRIO嵌入式系统开发流程总结
  19. 浮动时间怎么计算_轻松搞定PMP考试的计算题(四)时间参数计算
  20. 离散数学_命题逻辑的演绎推理

热门文章

  1. 多模光纤收发器的基本参数及主要特点
  2. 飞畅 8口RS-485集线器产品性能参数介绍
  3. 光端机各种类型的接口介绍
  4. [渝粤教育] 沈阳农业大学 有机化学 参考 资料
  5. 【渝粤题库】国家开放大学2021春3924★汽车电器设备构造与检修题目
  6. java criteria and_criteria用法
  7. php 有 stringbuffer,String、StringBuffer、StringBulider三者介绍
  8. 发言稿开场白范文_发言稿开场白
  9. html文字粒子效果简陋,5个很棒的CSS3文本粒子动画特效
  10. linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...