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

news2025/7/12 11:30:57

题目

在本问题中,有根树指满足以下条件的 有向
图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。

输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。附加的边包含在 1 到 n
中的两个不同顶点间,这条附加的边不属于树中已存在的边。

结果图是一个以边组成的二维数组 edges 。 每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi
的边,其中 ui 是 vi 的一个父节点。

返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。
在这里插入图片描述
在这里插入图片描述
提示:

n == edges.length
3 <= n <= 1000
edges[i].length == 2
1 <= ui, vi <= n

思路

本题相比冗余连接的区别就是变成了有向图

  1. 如果图中没有入度为2的节点,那么图中一定有有向环,要找到删除的边相当于找到构成环的那条边
  2. 对于图中入度为2的节点,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条后,判断如果这个图是一个树,那么这条边就是答案,同时注意要从后向前遍历,因为如果两条边删哪一条都可以成为树,就删最后那一条。

所以两个最关键的函数:

  • isTreeAfterRemoveEdge() 判断删一个边之后是不是树了
  • getRemoveEdge() 确定图中一定有了有向环,那么要找到需要删除的那条边,使其变成树

判断一个图是不是树,这里要用到并查集,因为在两个节点添加边之前,就可以在并查集中找到的话,添加这条边之后,这个图一定不是树,因为两个节点已经在集合中,这两个点之间的边就是冗余连接

java代码如下:

class Solution {
	private static final int N= 1000;
	private int[] father;
	public Solution {	
		father = new int[N];
		// 并查集初始化
		for(injt i = 0; i < N; i++){
			father[i] = i;
		}
	}
	
	// 并查集里寻根的过程
	private int find(int u){
		if(u == father[u]){
			return u;
		}
		father[u] = find(father[u]);
		return father[u];
	}
		
	// 将v->u 这条边加入并查集
	private void join(int u , int v){
		u = find(u);
		v= find(v);
		if(u == v) return;
		father[v] = u;
	}
	
	// 判断 u 和 v是否找到同一个根,即是否是同一个集合
	private boolean same(int u, int v){
		u = find(u);
		v = find(v);
		return u == v;
	}
	

    private void initFather() {
        // 并查集初始化
        for (int i = 0; i < N; ++i) {
            father[i] = i;
        }
    }

	//判断删一条边之后判断是不是树,deleteEdge 表示要删除的边
	private boolean isTreeAfterRemoveEdge(int[][] edges, int deleteEgde){
		initFather();
		for(int i = 0; i < edges.length; i++){
			if(i == deleteEdge) continue;
			if(same(edges[i][0],edges[i][1])){//如果第i条边的两个节点在同一个集合内,那么这条边一定是冗余连接,会构成有向环,一定不是树
				return false;
			}
			join(edges[i][0],edges[i][1]);//否则加入集合中
		}
		return true;
	}
	
	//在有向图里找到删除的那条边,使其变成树
	private int[] getRemoveEdge(int[][] edges) {
        initFather();
        for(int i = 0; i < edges.length; i++) {
            if(same(edges[i][0], edges[i][1])) { // 构成有向环了,就是要删除的边
                return edges[i];
            }
            join(edges[i][0], edges[i][1]);
        }
        return null;
    }


	public int[] findRedundantDirectedConnection(int[][] edges){
		int[] inDegree = new int[N];//统计入度
		for(int i = 0; i < edges.length; i++){
			inDegree[ edges[i][1] ] += 1;//edges[i][1]表示结尾的那个节点,相当于有别的节点指向自己,所以入度加一 
		}
			
		 // 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案
		 ArrayList<Integer> twoDegree = new ArrayList<Integer>();
		 for(int i = deges.length - 1; i >= 0; i--){
		 	if(inDegree[ edges[i][1] == 2 ]){//如果该节点的入度为2
		 		twoDegree.add(i);//把两条边都加入进来
		 	}
		 }
		 	
		 // 如果有入度为2的节点,那么一定是两条边里删一个,看删哪个可以构成树
		 if(!twoDegree.isEmpty()){
		 	if(isTreeAfterRemoveEdge(edges, twoDegree.get(0))){
		 		return edges[ twoDegree.get(0) ];
		 	}
		 	return edges[ twoDegree.get(1) ];
		}
		
		//明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了
		return getRemoveEdge(edges);
	}
}

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

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

相关文章

vb.net自定义白板

希沃白板在学校里基本上是一直使用的&#xff0c;但是在非希沃电脑里面是没有启动白板的 简答介绍思路和具体的功能 1、背景颜色和画笔颜色自由切换、画笔粗细1~20可以调节。 2、画笔样式&#xff1a;虚线、点线、短线 3、基本图形&#xff1a;矩形&#xff0c;正方形&…

程序员级别分析,看看你是哪个级别

关于程序员的工资众说纷纭&#xff0c;有说开七八千的&#xff0c;也有人说每月上万的&#xff0c;但不管怎么说&#xff0c;程序员的工资是真的比一些文职、行政人员岗位挣得多&#xff0c;大家都是靠自己的能力赚钱&#xff0c;这没什么可比的&#xff0c;况且大家都是在学习…

JAVASE零基础到高级教程(1)------ 集成开发环境安装使用

一 什么是环境变量 环境变量是在操作系统中⼀个具有特定名字的对象&#xff0c;它包含了⼀个或者多个应⽤程序所将使⽤到的 信息。例如Windows和DOS操作系统中的path环境变量&#xff0c;当要求系统运⾏⼀个程序⽽没有告诉它程 序所在的完整路径时&#xff0c;系统除了在当前⽬…

前端框架 Electron 使用总结

目录 一、基础搭建 通过脚手架搭建 1、Electron官方案例搭建环境 2、查看调试 3、菜单的使用 4、图标配置 5、项目打包 web应用相信每位程序员都不陌生&#xff0c;PC端应用可能会底层开发的就不是太多了&#xff0c;下面的这套技术栈就是为前端程序员快速一键搭建windo…

Linux学习——网络编程基础及TCP服务器

目录 一、网络采用分层的思想&#xff1a; 二、各层典型的协议&#xff1a; 三、网络的封包和拆包&#xff1a; 四、网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五、TCP编程API TCP协议分成了两个不同的协议&#xff1a;可靠传输&#xff1a;用来检测网络…

读书笔记-学习GNU Emacs-3终篇

学习本书目的&#xff1a; emacs的学习一直是陆陆续续看博客和上手实践&#xff0c;这次想通过阅读"学习GNU Emacs"这本书好好系统的再复习下emacs。 yps:读技术书应该是带着一定的目的去读的&#xff0c;最简单的目的可能就是为了学好某一项技术或者复习下某一项技…

[附源码]java毕业设计社区健康服务平台管理系统lunwen

项目运行 环境配置&#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…

IDEA利用maven建立javaWeb项目(IDEA 2021.3.3)

1、在Idea中配置maven (1)、打开Idea&#xff0c;点击File&#xff0c;然后点击Settings&#xff0c;进入设置&#xff0c;或者直接按CtrlAltS进入设置 (2)、先在左上角的搜索框输入maven&#xff0c;找到maven后单击&#xff0c;然后在右边的maven home path的右边选择你的m…

置信度--学习笔记

置信区间是衡量测量精度的一个指标&#xff0c;也能显示出估算有多稳定&#xff0c;也就是说如果重复做某项实验&#xff0c;得到的结果与最初的估计有多接近。步骤&#xff1a; 确定要测试的情况&#xff1a;如“A大学男生的平均体重是80公斤”&#xff0c;则后续就是要测试在…

最新最全面的Spring详解(三)——Resources,验证、数据绑定和类型转换与Spring表达式语言(SpEL)

前言 本文为 【Spring】Resources与Spring表达式语言&#xff08;SpEL&#xff09; 等相关知识&#xff0c;下边将对Resources&#xff08;包含&#xff1a;Resource接口、内置的 Resource的实现、ResourceLoader接口、应用环境和资源路径&#xff09;&#xff0c;验证、数据绑…

浅谈化工生产制造企业软件系统的选择

现在大家都在讨论全球COVID流行和经济衰退对企业的影响&#xff0c;以及一个有作为的企业&#xff0c;在当下的环境下如何求生存和谋发展的问题。“埃森哲的一份报告发现&#xff0c;99%的首席运营官都认为&#xff0c;使用实时数据运营对于应对Covid或经济衰退威胁等至关重要。…

Java的JDBC编程

1. 数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0c;C、C、Python等数据库&#xff0c;如Oracle&#xff0c;MySQL&#xff0c;SQL Server等数据库驱动包&#xff1a;不同的数据库&#xff0c;对应不同的编程语言提供了不同的数据库驱动包&#xff0c;如&#xf…

Telnet SMTP协议关于“535 Error: authentication failed“解决思路

计算机网络中应用层的SMTP(Simple Mail Transfer Protocol)协议可用来发送邮件&#xff0c;在Telnet使用SMTP登陆账号密码时出现“535 Error: authentication failed”问题。现记录解决步骤。 1. 确认在邮箱中已开启SMTP服务。 2. 按照扫码流程&#xff0c;获得授权密码&…

第六章第二节:图的遍历(广度优先遍历和深度优先遍历)和应用(最小生成树、最短路径、有向无环图的描述表达式、拓扑排序、关键路径)

文章目录1. 图的遍历1.1 广度优先搜索&#xff08;BFS&#xff09;1.1.1 遍历序列的可变性1.1.2 复杂度的分析1.1.3 广度优先生成树1..1.4 广度优先生成森林1.2 深度优先搜索&#xff08;DFS&#xff09;1.2.1 树的深度优先遍历1.2.2 图的深度优先遍历1.2.2 复杂度的分析1.2.4 …

Servlet | 域对象、request对象其它常用的方法

目录 一&#xff1a;域对象 1、应用域对象 2、请求域对象 二&#xff1a;request对象其它常用的方法 一&#xff1a;域对象 1、应用域对象 &#xff08;1&#xff09;应用域对象是什么&#xff1f; ServletContext &#xff08;Servlet上下文对象。&#xff09; 什么情况…

NCV7705DQAR2G 汽车电机驱动器(NCV7705DQR2G)引脚配置

型号&#xff1a;NCV7705DQAR2G NCV7705DQR2G 封装&#xff1a;36-BFSOP 类型&#xff1a;电机驱动器&#xff0c;控制器 NCV7705/NCV7705(A)是一款功能强大的汽车车身控制系统驱动IC。该集成电路设计用于控制车辆前门的多个负载。单片集成电路可以控制镜面定位、加热、折叠等…

JS测试出最小支持字体,以及修复PDFJS的文本错误偏移

PDFJS的文本层有时会有一个错误的整体偏移&#xff0c;导致文本处于错误位置&#xff0c;导致用户选择错误的文本。 为什么会这样呢&#xff1f;其一&#xff0c;如果浏览器的文本缩放不是100%&#xff0c;而PDFJS没有检测这一点&#xff0c;导致文本排布发生偏移。安卓可以通…

[附源码]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…

一个Adapter+recycleview实现多种布局,区分布局中

文章目录&#x1f353;&#x1f353;简述&#x1f353;&#x1f353;效果图&#x1f353;&#x1f353;代码&#x1f96d;&#x1f96d;AllAdapter.java&#x1f96d;&#x1f96d; FuritAdapter3.java&#x1f96d;&#x1f96d;MainActivity.java(主函数)&#x1f96d;&#…

适合中小企业的CRM客户关系管理系统?

1、CRM如果体量30人及下列 这类民营企业的特征是没营业网点&#xff0c;分散办公设备&#xff0c;一职多能&#xff0c;没他们的IT控制技术职责部门。通常老板重大决策&#xff0c;子公司全体相关人员采用。 主要就采用目地是管理组织工作顾客档案&#xff0c;历史记录顾客数…