并查集(UnionFindSet)
小米的校招题:
朋友圈(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都加到根节点里面去,然后非根节点存上根节点的下标,这样遍历数组时,为负数的就是根,负几那个朋友圈就有几个人,那几个人就是存这个根下标的元素。
具体实现如下:
- #include<iostream>
- #include<cassert>
- using namespace std;
- int FindRoot(int *set,int child)
- {
- assert(set);
- while(set[child] >= 0)
- {
- child = set[child];
- }
- return child;
- }
- void Combine(int *set,int root1,int root2)
- {
- assert(set);
- set[root1] += set[root2];
- set[root2] = root1;
- }
- int FindFrinedsCircle(int n,int m,int r[][2])
- {
- assert(r);
- int *set = new int(n);
- memset(set,-1,sizeof(int)*n);
- for(int i = 0;i < m;++i)
- {
- int first = r[i][0];
- int second = r[i][1];
- int root1 = FindRoot(set,first);
- int root2 = FindRoot(set,second);
- if(root1 != root2)
- {
- Combine(set,root1,root2);
- }
- }
- int count = 0;
- for(int i = 0;i < n;++i)
- {
- if(set[i] < 0 )
- {
- count++;
- }
- }
- return count;
- }
- int main()
- {
- int r[][2] = {{1 , 2} , {2 , 3} , {4 , 5}};
- cout<<FindFrinedsCircle(5,3,r)<<endl;
- return 0;
- }
并查集(UnionFindSet)相关推荐
- 并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并
并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并 并查集由一个整型数组和两个函数构成 1.数组pre[]:记录每个结点的前导结点(父节点),初始化为:pre[i]=i 2.函 ...
- 数据结构之并查集Union-Find Sets
1. 概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 2. 基本操作 并查集 ...
- 并查集 Python实现
1 # 并查集实现 2 class Node: 3 pass 4 5 class UnionFindSet: 6 def __init__(self, nodes): 7 self.fatherDic ...
- 算法练习day12——190331(并查集)
1.并查集 1.1 简介 用于解决检查两个元素是否属于一个集合: 合并两个元素各自所在的集合: 即: isSameSet(A,B):其中A属于set1,B属于set2,看set1和set2是否为同一个 ...
- 并查集(Union Find Set)
并查集(Union Find Set) 这篇文章我们来讲一下并查集,什么是并查集呢?来举一个形象的例子. 话说符文之地上居住着各式各样的英雄,他们效忠于自己的国家或部落,整天背着武器在外面执行任务,碰 ...
- 高级数据结构与算法 | 并查集(Union-Find)
文章目录 并查集的原理 并查集的实现 例题 并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合.开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于同一组元素的集合合并 ...
- java并查集找朋友圈_图—并查集(解决朋友圈问题)
图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构.图可以分为两种,无向图和有向图. ★图的定义: ★典型问题: 利用图能够解决很多问题,这里有一个较为典型的问题,假如已知有n个人和 ...
- 算到怀疑人生!如何用并查集解决朋友圈个数问题?
作者 | channingbreeze 责编 | 郭芮 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 今天小史去了一家社交小巨头公司 ...
- [L氏并查集] Python 列表法实现非递归并查集,轻松权重优化。
一般的并查集都是用递归或者新建一个类来实现,这里介绍一种用Python来实现的非递归非函数并查集,这个方法暂时未在其他地方见过,尤其是中文领域目前还未见过,很可能是搜索引擎无法搜索到正确内容的原因,所 ...
最新文章
- factory i/o下载_推荐 Dynalist.io 大纲笔记整理工具
- python 二叉树中所有距离为k的节点_leetcode 二叉树中所有距离为 K 的结点
- android 详解画图,android画图之贝塞尔曲线讲解详解
- 正确的线程中止-标志位
- 判断ShellExecute函数是否执行完一个程序的方法
- mysql-bin.000001文件的来源及处理方法
- 微信小程序 map 点击图标回到自己的位置(不使用controls控件)
- asp.net在线发送邮件,以前没做过,调试好了。
- Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库
- 2021年7月文章精选
- 为XNA制做安装程序(四)WIX Toolset 3.0 for Visual Studio 2008
- 编译用于高放射性环境的应用程序
- [zz]linux之sed用法
- java面向对象编程考试题_《Java面向对象程序设计》考试卷及答案带注释
- 第一课 矩阵的行图像与列图像(麻省理工公开课:线性代数)【转载】
- 计算机信息技术知识点思维导图,思维导图信息技术的学习方法
- php-后台权限的思路
- NI CompactRIO嵌入式系统开发流程总结
- 浮动时间怎么计算_轻松搞定PMP考试的计算题(四)时间参数计算
- 离散数学_命题逻辑的演绎推理
热门文章
- 多模光纤收发器的基本参数及主要特点
- 飞畅 8口RS-485集线器产品性能参数介绍
- 光端机各种类型的接口介绍
- [渝粤教育] 沈阳农业大学 有机化学 参考 资料
- 【渝粤题库】国家开放大学2021春3924★汽车电器设备构造与检修题目
- java criteria and_criteria用法
- php 有 stringbuffer,String、StringBuffer、StringBulider三者介绍
- 发言稿开场白范文_发言稿开场白
- html文字粒子效果简陋,5个很棒的CSS3文本粒子动画特效
- linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...