数据结构方面,你了解并查集么?

上交05年计算机复试 上机 畅通工程问题:

例题1 修路连通问题 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

本质可以理解成图论的连通分支 个数问题,只有一个连通分支,那么 点点互通,两个连通分支,那么需要一条路,。。。。。。

如果用计算机编程实现的话,可能有回路,很多节点,很多边,如何实现呢?那么就引出了并查集!

并查集由一个整数型的数组和两个函数构成。数组father[ ]记录每个点的前导点,函数 find 查找根节点,mix 合并。

  • int father[ ] 数组,记录上级领导。//分别记录了n个节点中,每一个点所在集群(连通分支)的上一级节点,每个节点需要一层层查询自己的根节点来判断自己所在的族群。直到某节点的上个节点是自己,那么他是本族群的根节点。
  • find 函数,返回大长老。就是通过 father【】数组记录的上层领导,来一层层查找本族群的大长老。(涉及到路径压缩)
  • mix 函数,加线。在俩族群A 、B之间连条线,这样两个本不互通的群互通了。随意指定,eg: 指定 A的大长老 a 的pre[ ]不再是自己了,而是B的大长老 b,相当于 加了个 a->b的线。
  • 再说路径压缩算法,加快查找的速度。最后生成的树,无法预测,可能是一字长蛇行,这样会查找所属族群的复杂度会大大提高。那么尝试路径压缩算法,尽量使一个族群呈现 两级的树结构,这样查找两步就可以 找到 大长老。

【转自 http://blog.csdn.net/u013546077/article/details/64509038】

前导点(上级领导)的设置:

【这种初始化用了一下感觉不太好,或者说自己写代码不顺手】初始化,可以都设为-1,先前对每个点编了号的,可以默认 小的作为 先导点,一个个去合并,壮大本朋友圈。

{1,2},{2,3},{4,5}分别是已知的朋友关系,最后问 一共有多少个朋友圈。【转自 http://blog.csdn.net/xiaobingRSQ/article/details/74371967】

常见的并查集代码 方法()

找朋友圈的个数,不用上图的方法吧。不通用,还是用最基本的 初始化的root点是其本身的方法。

例题2 朋友圈个数问题  小米的一道面试题:

假如已知有n个人和m对好友关系,如果两个人是直接或者间接有好友关系,则认为他们属于同一个朋友圈。写程序判断里面有多少朋友圈。
例如:
n = 5, m = 3  r = {(1,2), (2, 3), (4, 5)}  1 2 3 是一个朋友圈, 4 5 是一个朋友圈。
所以输出是2

package test;public class CircleOfFriends {public static void main(String[] args){int link[][] = {{1,2},{2,3},{4,5}};System.out.print(friendnum(5,3,link));}public static int friendnum(int n,int m,int[][]link ){int father[] = new int[n+1];primaryset(father);int x =0,y=0;for(int i = 0;i<m;i++){x = find(father,link[i][0]);y = find(father,link[i][1]);mix(father,x,y);//判断本边的两个father x和y是否是一个族}int cnt =0;for(int i = 0;i< father.length;i++){if(father[i] == i)cnt++;}return cnt-=1;//把0去掉,这里没有0这位朋友    }//初始化father[]public static void primaryset(int[] father){for(int i = 0;i<father.length;i++){father[i] = i;}}//public static int find(int[]father,int x){int r = x;while(father[r] != r){ //father[r]>0表示r之前已经有父亲了r = father[r];//while循环之后找到了 x的root节点 是 r}//路径压缩while(x!=r){int temp = father[x];father[x] = r;x = temp;}return r;}public static void mix(int[] father,int x,int y){if(father[x] == father[y] )return;//在father:x.y之间有间接连接的这时候,去判断是否父节点一样,如果不一样需要加线。if(x < y){father[y] = x;}else{father[x] =y;}}
}

并查集---找朋友圈个数问题,连通度问题,等的有效算法相关推荐

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

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

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

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

  3. java并查集找朋友圈_并查集求朋友圈最大人数

    #include #include using namespace std ; int findRoot( int set[ ], int s ) { if (s == set[s]) return ...

  4. 海贼OJ并查集练习题:朋友圈

    海贼OJ并查集练习题:朋友圈 题目描述 ​ 所谓一个朋友圈子,不一定其中的人都互相直接认识. ​ 例如:小张的朋友是小李,小李的朋友是小王,那么他们三个人属于一个朋友圈. ​现在给出一些人的朋友关系, ...

  5. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  6. 并查集解决朋友圈问题

    引入 最近在网上看到了这样一道面试题: 假如已知有n个人和m对好友关系(存于数组r)如果两个人是直接或间接的好友(好友的好友的好友-),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋 ...

  7. 并查集——小米笔试题求朋友圈个数,分小组个数

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

  8. Codeforces 103B - Cthulhu(并查集 找环和块)

    传送门:https://codeforces.com/problemset/problem/103/B 题意: 给一个n个结点,m条边的无向图 判断给定图是否满足以下条件: 能被表示为有3个及以上的有 ...

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

    假设有A,B,C,D,E,5个人A,B在一个朋友圈内,B,C在一个朋友圈内,这样A,B,C就在一个朋友圈内,总共有多少个朋友圈. 当人数较多时不容易算出. 可以利用数据结构查并集. 设5个人的初值为- ...

最新文章

  1. 如何实现electron多页面间通信
  2. Active MQ的安装
  3. 深入探索.NET框架内部了解CLR如何创建运行时对象
  4. linux最小安装桌面,Linux工作环境:CentOS7最小安装+Xfce桌面环境
  5. c# 后台 添加datable 数据
  6. 知识图谱在美团推荐场景中的应用实践
  7. Shell Curses 函数库
  8. c语言坐标画图,C语言中绘图的函数库
  9. smarty 模板php,php的smarty模板发动机
  10. 【SAP-FICO详细教程】
  11. 滑模鲁棒控制(hm-3)
  12. Cocos2dx 3.2 横版过关游戏Brave学习笔记(一)
  13. 待忧伤开满山岗,等青春散场
  14. JavaScript-- 基础知识面试题
  15. 双非普通一本大一学生学期末课设——运动会比赛计分系统
  16. 教你在word中为一句话同时加上横线和波浪线
  17. 关于表单防重复提交一些东东
  18. “七彩”糖果-吕中琪
  19. 2022年甘肃省职业院校技能大赛“网络搭建与应用”赛项
  20. 大连财经学院计算机老师,教师风采|“教书、管理、服务育人三合一”——我校会计学院教师王晓云...

热门文章

  1. R语言可视化包ggplot2绘制Bump Chart(凹凸图)实战
  2. 2023蓝桥杯学习与刷题建议
  3. 【宋红康 MySQL数据库】【00】课程大纲
  4. 使用Bento4在ubuntu16.04切片视频并生成MPD
  5. 贝叶斯网络结构学习若干问题解释
  6. [附源码]java毕业设计石林县石漠化信息查询分析系统
  7. 最新游戏评测门户资讯交流论坛网站源码+Dz内核
  8. Microsoft Office
  9. IBM磁盘阵列配置教程
  10. 为什么电源纹波那么大?