代码随想录——冗余连接(并查集)

news2024/12/23 9:53:58

题目

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n
中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi]
表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。
提示:
在这里插入图片描述
在这里插入图片描述
提示:

n == edges.length
3 <= n <= 1000
edges[i].length == 2
1 <= ai < bi <=edges.length
ai != bi
edges 中无重复元素
给定的图是连通的

思路

本题是并查集基础题目;

并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:

  • 合并(Union):把两个不相交的集合合并为一个集合。
  • 查询(Find):查询两个元素是否在同一个集合中。

即并查集主要是解决就是集合问题,看两个节点在不在一个集合,也可以将两个节点添加到一个集合中

并查集模板如下:

int n = 1005;//节点数量3 到 1000
int father[1005];

//并查集初始化
void init(){
	for(int i = 0; i < n; i++){
		father[i] = i;
	}
}
//并查集里寻根的过程
int find(int u){//找节点u的祖先节点
	if(u == father[u]){//如果u的祖先节点就是自己
		return u;
	}
	father[u] = find(father[u]);//否则继续找下去
	return father[u];
}
//将v->u 这条边加入并查集
void join(int u, int v){
	u = find(u);//找到u的祖先
	v = find(v);//找到v的祖先
	if(u == v) return;//如果相同,说明两个节点已经在一个集合中
	father[v] = u;//否则,加入这条边
}
//判断 u 和 v 是否找到同一个根,即是否在同一个集合中
bool same(int u ,  int v){//判断两个节点在不在同一个集合中
	u = find(u);
	v = find(v);
	return u == v;
}

具体只需要修改n和father数组的大小就可以了

并查集有三个功能:

  1. 寻找根节点,函数:find(int u),也就是判断节点 u 的祖先节点是哪个
  2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点 u和 v连在同一个根节点上
  3. 判断两个节点是否在同一个集合,函数:same(int u, int v),就是判断两个节点是不是同一个根节点

在本题中,题意为无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树,如果有多个答案,则返回二维数组中最后出现的边。

那么就可以从前向后遍历每一条边,边的两个节点如果不在同一个集合,就加入集合(即:同一个根节点)。

如果边的两个节点已经出现在同一个集合里,说明这条边的两个节点已经连在一起了,如果再加入这条边一定就出现环了。

java代码如下:

class Solution {
	private int n;
	private int[] father;
	public 	Solution(){
		n = 1005;
		father = new int[n];
		
		//并查集初始化
		for(int i =  0; i < n; i++){
			father[i] = i;
		}
	}
	
	// 并查集里寻根的过程,找父节点
	public int find(int u){
		if(u == father[u]){
			return u;
		}
		father[u] = find(father[u]);
		return father[u];
	}
	
	//将v->u 这条边加入并查集
	public void join(int u, int v){
		u = find(u);
		v = find(v);
		if(u == v) return;
		fatjer[v] = u;
	}
		
	public boolean same(int u, int v){
		u = find(u);
		v = find(v);
		return u == v;
	}
		
	public int[] findRedundantConnection(int[][] edges){
		for(int i = 0; i < edges.length; i++){
			if(same(edges[i][0],edges[i][1])){//edges[i][0] 表示第i条边的起始节点,edges[i][1]表示第i条边的结束节点,这里的判断就是说这条边的两个节点是否在同一个集合中,如果在的话,那就说明这两个节点之间连接的这条边是冗余连接,会构成环,需要删除
				return edges[i];//如果在同一个集合中,说明这条边是冗余的,加入后会成环,返回这条边
			} else {
				join(edges[i][0],edges[i][1]);//否则加入这条边
			}
		}
		return null;
	}
}

其中,主函数的代码很少,就判断一下边的两个节点在不在同一个集合就可以了

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

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

相关文章

(C语言)成绩统计

[#4练习赛]成绩统计 题目描述 传智专修学院的“Java程序设计”班有 N(1≤100)N(1 \le 100)N(1≤100) 个学生&#xff0c;知道他们的个人信息和成绩&#xff1a; 姓名&#xff08;长度不超过 202020 的仅由小写字母组成的字符串&#xff09;平时分成绩&#xff08;000 到 100…

网格窗帘布能符合NFP92-503法国M2级别要求吗?

NFP 92-503是针对建筑材料类产品的阻燃性能测试&#xff0c;主要分为M1-M4四个级别&#xff0c;M1为最高级别&#xff0c;以此类推&#xff0c;故而M2对阻燃要求还是比较严格的&#xff0c;布料要申请M2要求的话&#xff0c;前提至少要有阻燃处理了。 NFP 92-503 建筑材料阻燃测…

振弦采集模块主动上传测量数据( UART)

振弦采集模块主动上传测量数据&#xff08; UART&#xff09; 默认情况下 VMXXX 模块总是以从机身份与主机完成数据交互&#xff0c; 在这种主从结构中&#xff0c; VMXXX 从不主动上传数据&#xff0c; 可通过修改自动上传寄存器&#xff08; ATSD_SEL&#xff09;来实现模块主…

论文阅读笔记 | 三维目标检测——MV3D算法

如有错误&#xff0c;恳请指出。 文章目录1. 背景2. 网络结构2.1 提案投影网络2.2 区域融合网络3. 实验结果paper&#xff1a;《Multi-View 3D Object Detection Network for Autonomous Driving》 1. 背景 激光雷达可以提供物体的深度信息&#xff0c;而摄像头可以提供物体的…

麦子-linux字符设备驱动初探

字符驱动的联系 框架 软件支持&#xff1a;驱动 驱动类型 1、字符驱动&#xff08;每次读取一个字节&#xff09; 2、块驱动&#xff08;每次读取多个字节&#xff09; 3、网络设备驱动&#xff08;协议栈&#xff09; 设备号dev_t 内核中使用类型dev_t来描述设备号&…

【Unity3D】Unity 脚本 ④ ( 游戏物体 GameObject 的坐标 | 修改 游戏物体 GameObject 的本地坐标 )

文章目录一、 游戏物体 GameObject 的坐标二、 修改 游戏物体 GameObject 的本地坐标一、 游戏物体 GameObject 的坐标 游戏物体 GameObject 的坐标 有 2 种 : 世界坐标 : 调用 Transform#position 属性 获得 ;本地坐标 : 调用 Transform#localPosition 属性 获得 ,本地坐标 就…

这份Java大厂常见面试题解析,你的闭关修练宝典!

纵观今年的技术招聘市场&#xff0c; Java依旧是当仁不让的霸主 &#xff01;即便遭受 Go等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b; Java在 运维、可观测性、可监 控性方面都有着非常…

Materials Studio8.0

centos7.9 检查主机名&#xff1a; 检查环境&#xff1a; [rootmaster conf]# rpm -qa|grep glibc; rpm -qa|grep libgcc; rpm -qa|grep libstdc ;rpm -qa|grep redhat-lsb Materials Studio8.0软件包 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;fomg 软件…

【LeetCode每日一题:891. 子序列宽度之和~~~排序+数学推导】

题目描述 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums &#xff0c;返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大&#xff0c;请返回对 109 7 取余 后的结果。 子序列 定义为从一个数组里删除一些&#xff08;或者…

骗赞小程序(仅供恶搞)

作为一个 良 凉心博主&#xff0c;平时发的文章得不到点赞&#xff0c;也得不到关注&#xff0c;这改如何办&#xff1f;很简单只需要勤奋发文 威逼利诱。如何威逼利诱&#xff0c;用关机啊&#xff01; 所以&#xff0c;我们需要一个程序&#xff0c;让用户自行选择是否进行关…

85服务-ControlDTCSetting

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;本文介绍诊断和通讯管理功能单元下的85服务ControlDTCSetting&#xff0c;该服务的目的是控制DTC设置。 文章目录诊断协议那些事儿一、85服务-ControlDTCSetting二、请求格式DTCSettingType三、肯定响应格式四、否…

PLC滑动平均值滤波(SMART 200梯形图篇)

滑动平均值滤波的算法原理请参看《信号处理》专栏的其它文章,这里给出简单快速写法,以供参考。 S7-200 SMART PLC信号处理系列之滑动平均值滤波FB_RXXW_Dor的博客-CSDN博客_plc平均值滤波程序PLC相关滤波算法,专栏有很多详细讲解这里不再赘述。滑动平均值滤波和算术平均值滤…

基于51单片机的多功能视力保护台灯

目录 摘要. 1 1弓I言 1 1.1 选 题 背 景 1 2 视力保护器的现状 2 1.3 本文主要研究内容 3 2系统硬件 设计 31 89c52 单片机简介 4 2.2 超声波测距报警 电路 53 89c5 2 单片机的中断系统 74 光线报警电路 8 1 光敏电阻控制电路 8 2.5 定时报菩电路 9 2.5. 1 单片机控制电路 10 …

[附源码]SSM计算机毕业设计茶园文化交流平台论文JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

u-boot对设备树的支持__传递dtb给内核

a. u-boot中内核启动命令: bootm <uImage_addr> // 无设备树,bootm 0x30007FC0 bootm <uImage_addr> <initrd_addr> <dtb_addr> // 有设备树 比如 : nand read.jffs2 0x30007FC0 kernel; // 读内核u…

两客一危解决方案-最新全套文件

两客一危解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、多维数据融合2、车辆轨迹分析3、AI 视频分析4、评价体系四、获取 - 两客一危全套最新解决方案合集一、建设背景 “两客一危一货”车辆是指公路客运、旅游客运、危化品运输车及货运车辆。“两客一危”车辆…

【freeRTOS】操作系统之三-信号量

1 二值信号量 1.1 二值信号量简介 ​ 二值信号量通常用于互斥访问或同步&#xff0c;二值信号量和互斥信号量非常类似&#xff0c;但是还是有一 些细微的差别&#xff0c;互斥信号量拥有优先级继承机制&#xff0c;二值信号量没有优先级继承。因此二值信号量更适合用于同步(任…

计算机毕业设计springboot+vue+elementUI 广场舞团高校舞蹈社团管理系统

项目介绍 随着时代的发展&#xff0c;高校的社团发展完善&#xff0c;同时越来越多的年轻人喜欢广场舞以及各类舞蹈。为了让更多的年轻人能够有一个自己喜欢的爱好&#xff0c;并且有一个共同交流的平台。我们开发了本质的广场舞团&#xff0c;高校社团管理系统。通过本系统可…

代码随想录day59|503. 下一个更大元素 II|42. 接雨水|Golang

代码随想录day59 还剩下一天 目录 代码随想录day59 503. 下一个更大元素 II 42. 接雨水 双指针解法 动态规划解法 单调栈解法 503. 下一个更大元素 II func nextGreaterElements(nums []int) []int {n : len(nums)ans : make([]int,n,n)for i:0;i<len(ans);i{ans[i]…

ECCV2022 商汤 发布最大的表征学习预训练数据集OmniBenchmark解读

近些年&#xff0c;基于深度模型的表征学习算法在某些知识域上&#xff08;例如人脸、动物等&#xff09;取得了非常优异的成绩&#xff0c;然而由于现有数据集覆盖的视觉类别仍然比较有限&#xff0c;一个覆盖视觉类别足够广&#xff0c;且能够支持学习到适用于许多视觉类别的…