堆的应用--并查集解决“擒贼先擒王”问题(JAVA)

现在有10个强盗。
1号强盗与2号强盗是同伙。
3号强盗与4号强盗是同伙。
5号强盗与2号强盗是同伙。
4号强盗与6号强盗是同伙。
2号强盗与6号强盗是同伙。
8号强盗与7号强盗是同伙。
9号强盗与7号强盗是同伙。
1号强盗与6号强盗是同伙。
2号强盗与4号强盗是同伙。
另外,强盗同伙的同伙也是同伙。你能帮助警方查出有多少个独立的犯罪团伙吗?

Input:
10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
第一行n m,n表示强盗的人数,m表示警方搜集到的m条线索。接下来的m行每一行有两个数 a b。表示强盗a和强盗b是同伙。

Output:
3

并查集实际上是通过一个一维数组来实现,其本质是维护一个森林。起初,森林的每个点都是孤立的,这里可以将点理解为只有自身一个结点的树,通过查找与合并,逐渐将这些树合并为一颗大树。其实合并的过程就是子节点并到父结点上的过程。 在每次判断两个结点是否已经在同一颗树中的时候,也要注意必须求其根源,必须一直往上找到其祖先结点(树的根节点)。

解题思路:
main() {
  1.初始化数组init()
  2.输入“关系”,每次都合并merge()
  3.有几个f[i] = i就有几个独立的树
}
init() {
  f[i] = i
}
merge() {
  1.获取两个点的祖先结点
  2.如果相等,则遵循“靠左原则”
}
getf() {
  1.如果f[i] = i,说明正是祖先,直接返回
  2.否则f[v] = getf( f[v] ),压缩路径,返回
}

import java.util.Scanner;public class Main3 {static int[] f = new int[1000];static int n, m;static  int sum = 0;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();init();for (int i = 1; i <= m; i++) {int x = input.nextInt();int y = input.nextInt();merge(x, y);}/*** f[i]=i,说明这个结点的层级最高* 有多少个高层级就有几个独立的树* */for (int i = 1; i <= n; i++) {if (f[i] == i) {sum++;}}System.out.println(sum);}/*** 初始化函数* 数组里面存自己的下标* */private static void init() {for (int i = 1; i <= n; i++) {f[i] = i;}}/*** 查找父结点的递归函数* */private static int getf(int v) {if (f[v] == v) {return v;} else {/*** 压缩路径,每次函数返回时,将该位置的编号转成祖宗编号* */f[v] = getf(f[v]);return f[v];}}/*** 合并两个子集和* */private static void merge(int v, int u) {int t1 = getf(v);int t2 = getf(u);/*** 判断祖先是否相同* */if (t1 != t2) {/*** 靠左原则* */f[t2] = t1;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVa 201 Square

这道题&#xff0c;没什么&#xff0c;就查找正方形&#xff0c; 特别注意一下 \n 的使用。 //UVa 201 //Square //#define LOCAL #include <stdio.h> #include <string.h> //use memset int dot[11][11][11][11], N;int getS(int size) {int cnt 0, flag;for(…

图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法&#xff0c;现在又讲最小生成树算法&#xff0c;这两个算法有什么区别呢&#xff1f; 首先要明确&#xff0c;最短路径和最小生成树是两个不同的概念。 最短路径是对于一个图的两个结点而言的。在一个图中&#xff0c;结点A通过某些结点和边可以…

图论算法(五)--求解割点、割边(JAVA)

割点&#xff1a;对于一个连通图来说&#xff0c;如果删除某个点之后图不再连通&#xff0c;这个点就称为割点 割点算法 时间复杂度&#xff1a;O(NM) 但是下面给出的算法时间复杂度为O(N^2)&#xff0c;这是因为下面的存储结构都是邻接矩阵&#xff0c;这样的话用该算法就完…

express+handlebars 快速搭建网站前后台

最近在重构公司网站&#xff0c;原来网站使用PHP&#xff0c;前后端不分离&#xff0c;添加与更新网站内容仍使用原始方法&#xff0c;先出布局再把调好的布局给PHP后端开发&#xff0c;花时间长&#xff0c;维护不易。因此决定将网站前后端分离&#xff0c;核心功能含网站下单…

图论算法(六)-- 二分图的最大分配问题(JAVA)

二分图&#xff1a;又称二部图&#xff0c;如果一个图的所有顶点可以被分为X和Y两个集合&#xff0c;并且所有边的两个顶点恰好一个属于一个集合X&#xff0c;另一个属于集合Y&#xff0c;即每个集合内的顶点没有边相连&#xff0c;那么这个图就是二分图。 二分图的最大分配问…

定义一个二维数组并输入数据,将二维数组元素的值按升序排列,并输出排序后的二维数组。

目录 问题&#xff1a; 回顾&#xff1a; 给出两种做法&#xff1a; 解法一&#xff1a;调用qsort 函数进行排序 代码&#xff1a; 运行结果&#xff1a; 解法二&#xff1a;冒泡排序 代码&#xff1a; 运行结果: 回顾里的4种方法的模板参考&#xff1a; 1.冒泡排序…

.net core中使用GB2312编码

引用 System.Text.Encoding.CodePages 注册 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);转载于:https://www.cnblogs.com/liushunli/p/10342521.html

实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

题目&#xff1a; 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码“BLOCKCIPHERDESIGNPRINCIPLE”&#xff0c; 但是它忘记了密钥是什么&#xff0c; 手头&#xff08;爪头&#xff09;只有它自己加密过的密钥“HTRUZYJW”&#xff0c; 而且它 还知道原密钥是一个…

第五届省赛(软件类)真题----Java大学C组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学C组答案及解析 杨辉三角调和级数回文素数过大年位平方和单位分数n级台阶 一、杨辉三角 二项式的系数规律&#xff0c;我国数学家很早就发现了。 如【图1.png】&#xff0c;我国南宋数学家杨辉1261年所著的《详解九…

Angular4.x 安装|创建项目|目录结构|创建组件

Angular4.x 安装|创建项目|目录结构|创建组件 安装最新版本的 nodejs node.js 官网&#xff1a;https://nodejs.org/zh-cn/ 去官网下载 node.js&#xff0c;下一步下一步就可以了。只要 node.js 安装成功&#xff0c;那么 npm 也会帮你安装完成&#xff01; 注意&#xff1a;请…

第五届省赛(软件类)真题----Java大学B组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学B组答案及解析 正则切分调和级数n的n次幂七对数字勾股定理九阶数独G将军 一、正则切分 java中提供了对正则表达式的支持。 有的时候&#xff0c;恰当地使用正则&#xff0c;可以让我们的工作事半功倍&#xff01; …

第五届省赛(软件类)真题----Java大学A组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学A组答案及解析 子序列最大长度莱布尼茨公式n的n次幂七对数字勾股定理九阶数独矩阵射线 一、子序列最大长度 一个串的子串是指该串的一个连续的局部。如果不要求连续&#xff0c;则可称为它的子序列。 比如对串&…

js获取一个月的天数

在使用其他语言获取每月天数的时候&#xff0c;一般都是存储到一个数组中进行获取&#xff0c;但是如果是二月份的话就需要首先判断是否闰年&#xff0c;再确定是28还是29了。 js可以通过Date对象很方便的获取到每月的天数&#xff0c;在初始化Date对象时&#xff0c;我们可以通…

第六届省赛(软件类)真题----Java大学C组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子 一、隔行变色 Excel表的格子很多&#xff0c;为了避免把某行的数据和相邻行混淆&#xff0c;可以采用隔行变色的…

spring_01概念及案例

1.什么是IOC?   IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContext.xml),而程序本身不再维护 2.什么是di? dependency injection,依赖注入,di和IOC是一个概念,spring的设计者认为di等…

斐波那契数列(二)--矩阵优化算法

之前写了一篇从斐波那契数列分析递归与动态规划&#xff08;JAVA&#xff09;来优化斐波那契数列&#xff0c;这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)f(n-1)f(n-2)求斐波那契数列的最优算法&#xff0c;但是这只是一维世界下的极限。下面我们将其从一…

第六届省赛(软件类)真题----Java大学B组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学B组答案及解析三角形面积立方变自身三羊献瑞循环节长度九数组分数加法变乘法牌型种数饮料换购垒骰子生命之树 一、三角形面积如【图1】所示。图中的所有小方格面积都是1。那么&#xff0c;图中的三角形面积应该是多少…

【学习总结】GirlsInAI ML-diary day-11-while循环

【学习总结】GirlsInAI ML-diary 总 原博github链接-day11 认识while循环执行 对于while/break/continue的认识 新值替换变量 一般while语句 无限循环 & break continue 作业 1-更新变量 这一条没什么新的东西&#xff0c;别的语言也一样&#xff1a;python在赋值时&#x…

第六届省赛(软件类)真题----Java大学A组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学A组答案及解析熊怪吃核桃星系炸弹九数分三组循环节长度打印菱形加法变乘法牌型种数移动距离垒骰子灾后重建一、熊怪吃核桃森林里有一只熊怪&#xff0c;很爱吃核桃。不过它有个习惯&#xff0c;每次都把找到的核桃分成…

@PathVariable、@RequestParam、@RequestBody注解

讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-wonder/p/8920553.html PathVariable注解的作用&#xff0c;获取请求地址中传递的参数&#xff0c;即&#xff1a;从URL模版中取值。 RequestParam 是从reque…