代码随想录训练营 Day56打卡 图论part06 108. 冗余连接 109. 冗余连接II

代码随想录训练营 Day56打卡 图论part06

一、卡码108. 冗余连接

题目描述
有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图:

现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图:

先请你找出冗余边,删除后,使该图可以重新变成一棵树。
输入描述
第一行包含一个整数 N,表示图的节点个数和边的个数。
后续 N 行,每行包含两个整数 s 和 t,表示图中 s 和 t 之间有一条边。
输出描述
输出一条可以删除的边。如果有多个答案,请删除标准输入中最后出现的那条边。
输入示例
3
1 2
2 3
1 3
输出示例
1 3
提示信息

图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输出里最后出现的那条边,所以输出结果为 1 3

  1. 树的性质:一棵树有 n 个节点和 n-1 条边,是一个连通且无环的图。如果给一棵树多加一条边,那么它就会形成一个环。
  2. 寻找冗余边:使用并查集来判断每次加边时,是否会形成环。如果发现某一条边连接的两个节点已经属于同一个连通分量(即它们已经连通),说明这条边是冗余的,即它会导致环的出现。
  3. 返回结果:根据题目要求,返回输入中最后出现的那条冗余边。

代码实现

class Solution:def findRedundantConnection(self, edges: list[list[int]]) -> list[int]:n = len(edges)  # 由于题目给定 n 条边,所以有 n 个节点parent = list(range(n + 1))  # 初始化并查集,每个节点的父节点初始化为它自己# 并查集的 find 函数,使用路径压缩优化def find(index: int) -> int:if parent[index] != index:  # 如果当前节点的父节点不是自己parent[index] = find(parent[index])  # 递归找到根节点,并将路径上的所有节点直接指向根节点return parent[index]  # 返回根节点# 并查集的 union 函数,合并两个节点所在的集合def union(index1: int, index2: int):parent[find(index1)] = find(index2)  # 将 index1 的根节点连接到 index2 的根节点# 遍历所有边,执行并查集的合并操作for node1, node2 in edges:if find(node1) != find(node2):  # 如果 node1 和 node2 不在同一个集合中union(node1, node2)  # 合并它们的集合else:return [node1, node2]  # 如果 node1 和 node2 已经在同一个集合中,说明这条边是冗余边return []  # 题目保证输入合法,所以不会执行到这里

卡码题目链接
题目文章讲解

二、卡码109. 冗余连接II

题目描述
有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:

现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图:

输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。
输入描述
第一行输入一个整数 N,表示有向图中节点和边的个数。
后续 N 行,每行输入两个整数 s 和 t,代表这是 s 节点连接并指向 t 节点的单向边
输出描述
输出一条可以删除的边,若有多条边可以删除,请输出标准输入中最后出现的一条边。
输入示例
3
1 2
1 3
2 3
输出示例
2 3
提示信息

在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3

这道题的目的是在有向图中找到一条冗余边,该冗余边可以是多余的边或导致图中形成环路的边。具体解决思路是通过并查集和父节点数组相结合,来处理节点的父节点冲突以及环路检测问题。

题解思路

  1. 分析图的性质:
    树的性质:一棵树有 n 个节点和 n-1 条边,是一个无环的连通图。
    有向图的情况:给定的图有 n 个节点和 n 条边,多了一条附加的边,因此图可能会出现两种情况:
        · 有一个节点有两个父节点,即一个节点被指向两次。
        · 有环路,即一个节点可以通过有向边回到自己。
  2. 解决方法:
    记录每个节点的父节点:使用数组 parent 来记录每个节点的父节点。如果发现某个节点有两个父节点,说明存在冲突(conflict)。
    使用并查集检测环路:通过并查集(Union-Find)来检测是否有环路(cycle)。如果在合并时发现两个节点已经属于同一集合,说明这条边会导致环路。
    根据冲突和环路的情况返回结果
    如果有冲突但没有环路,那么冲突的边就是冗余边。
    如果同时有冲突和环路,优先返回与环路相关的边。
    如果没有冲突但有环路,返回环路中的最后一条边。

举个栗子

为什么优先删除与环路相关的边?
如果有冲突但没有环路,那么说明其中一条边只是使某个节点有两个父节点,此时直接删除指向该节点的后出现的那条边即可。

但如果同时存在父节点冲突和环路,此时导致问题的根源是环路,因为冗余边不仅让一个节点有两个父节点,还让整个图形成了一个环。优先删除与环路相关的边可以确保解决问题。

假设输入的图如下:

edges = [[1, 2], [2, 3], [3, 4], [4, 2], [1, 5]]

图的结构:

   1/ \2 - 5|3|4|2  <-- 环路
  • 父节点冲突:边 [4, 2] 让节点 2 有两个父节点(分别是 1 和 4)。
  • 环路:2 → 3 → 4 → 2 形成一个环。

此时,我们要优先删除形成环的那条边,即 [4, 2],这样可以确保我们既消除了环路,又让图成为一棵树。

因此,在有冲突和环路的情况下,删除环路中的冗余边更能有效解决问题,避免冗余的边继续影响树的结构。

冲突是因为一个节点有多个父节点。
环路是因为多余的边使得整个图不再是树。

代码实现

class UnionFind:def __init__(self, n):# 初始化并查集,每个节点的祖先初始化为自己self.ancestor = list(range(n))# 合并两个节点所在的集合def union(self, index1: int, index2: int):# 找到两个节点的根,并将其中一个根指向另一个根self.ancestor[self.find(index1)] = self.find(index2)# 查找节点的根,同时进行路径压缩def find(self, index: int) -> int:if self.ancestor[index] != index:# 路径压缩,将当前节点的父节点直接指向根self.ancestor[index] = self.find(self.ancestor[index])return self.ancestor[index]class Solution:def findRedundantDirectedConnection(self, edges: list[list[int]]) -> list[int]:n = len(edges)  # 图的节点数uf = UnionFind(n + 1)  # 初始化并查集parent = list(range(n + 1))  # 每个节点的父节点初始化为自己conflict = -1  # 记录冲突边的索引cycle = -1  # 记录环路边的索引# 遍历所有边for i, (node1, node2) in enumerate(edges):if parent[node2] != node2:# 如果 node2 已经有父节点,说明冲突发生,记录这条边conflict = ielse:# 否则,更新 node2 的父节点为 node1parent[node2] = node1# 判断是否形成环路if uf.find(node1) == uf.find(node2):# 如果 node1 和 node2 已经属于同一个集合,说明形成了环路cycle = ielse:# 如果没有形成环路,将 node1 和 node2 合并到同一个集合uf.union(node1, node2)# 如果没有冲突边,返回导致环路的那条边if conflict < 0:return [edges[cycle][0], edges[cycle][1]]else:# 处理冲突边conflictEdge = edges[conflict]if cycle >= 0:# 如果有环路,返回与环路相关的边return [parent[conflictEdge[1]], conflictEdge[1]]else:# 如果没有环路,直接返回冲突边return [conflictEdge[0], conflictEdge[1]]

时间复杂度

  • 查找和合并的均摊时间复杂度为 O(α(n)),其中 α(n) 是反阿克曼函数,近似为常数。
  • 遍历所有边的时间复杂度为 O(n)。
  • 总体复杂度接近 O(n)。

卡码题目链接
题目文章讲解

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

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

相关文章

二、Android Studio集成ffmpeg so

目录 1、前言 2、新建AS工程 2.1 选择Native C 2.2 按图编辑和编辑 2.3 选择C标准 2.4 最初工程目录展示 3、拷贝so库到AS 4、编辑CMakeLists.txt 5、修改build.gradle 6、编辑Native-lib.cpp 7、修改MainActivity.java 8、效果展示 1、前言 本文章之前也是参考了…

HTML5中IndexedDB前端本地数据库

一、indexedDB为何替代了Web SQL Database&#xff1f; 跟小朋友的教育从来没有什么“赢在起跑线”这种说法一样&#xff0c;在前端领域&#xff0c;也不是哪来先出来哪个就在日后引领风骚的。 HTML5 indexedDB和Web SQL Database都是本地数据库数据存储&#xff0c;Web SQL Da…

DX-5009N 10G交换机 SFP接口+猫棒 代替运营商光猫 【注册状态O5但是无法PPPoe拨号踩坑——交换机VLAN配置】

买了个诺基亚 猫棒&#xff0c;准备代替光猫&#xff0c;还弱电箱一个清净 参数填完一切正常&#xff0c;注册状态O5 但是openwrt拨号死活上不去。windows拨号也是651 网络架构 SPF口与网口8为同一vlan&#xff0c;做光电转换&#xff0c;交给路由器wan口 路由器PPPoe拨号 1-7网…

『功能项目』播放动画时禁止点击移动【40】

我们打开上一篇39GameObject对象池 - 第三职业的项目&#xff0c; 本章要做的事情是在第三职业播放续航攻击动画时禁止点击时触发的移动函数&#xff0c;换句话说是在播放攻击动画时禁止移动 修改脚本&#xff1a;PlayerRayClickNavigation.cs 运行项目 - 播放第三职业续航技能…

(十四)、为 SpringCloud 项目生成 Docker 镜像

文章目录 1、原理2、最佳实践2.1、获得 SpringCloud 微服务启动模块的 jar 文件2.2、准备文件夹和 Dockerfile 文件2.3、 Dockerfile 文件的内容2.4、通过命令行构件新镜像 3、异常情况和处理&#xff1a;failed to create LLB definition3.1、现象3.2、解决配置国内镜像仓库清…

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点&#xff1a; #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram; GLuint vao[numVAOs];GLuint createShaderProgram () {const char *v…

SQL的增删改查CRUD练习知识点(day27)

1 学习目标 重点掌握插入单条记录的语法了解全表插入记录的语法重点掌握修改记录的语法重点掌握删除记录的语法重点掌握主键约束、外键约束了解检查约束、非空约束、唯一约束 2 数据类型 MySQL支持多种数据类型&#xff0c;大致可以分类三类&#xff1a;数值、日期和字符串。…

【Maven】Maven 下载安装教程(超详细)(day30)

1 学习目标 了解Spring了解SpringBoot重点掌握创建SpringBoot项目重点掌握聚合项目的创建了解Spring基于XML方法进行IOC和依赖注入了解Maven的概念重点掌握使用Maven构建项目重点掌握使用Maven进行依赖引入 2 Maven 2.1 概述 Maven是跨平台的项目管理工具。作为Apache组织中…

Python(一)-快速入门

第一个入门实例 print(hello python) 注释 #:单行注释""" """:多行注释 # 这是单行注释 # 输出一个喜欢读的课外书 print("我最喜欢读 追风筝的人")print("----------------------------")"""这是多…

Python爱心射线

系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

2024年录屏神器大盘点,轻松捕捉屏幕精彩

现在讲解一些操作越来越便捷了&#xff0c;我 一般都是用录屏工具来边录制操作边讲解&#xff0c;这样可以更方便对方了解操作步骤。这次我就分享几款免费录屏工具一起来试试吧。 1.福晰录屏软件 链接&#xff1a;www.foxitsoftware.cn/REC/ 对于初次尝试录屏的新手来说&…

每天五分钟玩转深度学习框架PyTorch:获取神经网络模型的参数

本文重点 当我们定义好神经网络之后,这个网络是由多个网络层构成的,每层都有参数,我们如何才能获取到这些参数呢?我们将再下面介绍几个方法来获取神经网络的模型参数,此文我们是为了学习第6步(优化器)。 获取所有参数Parameters from torch import nn net=nn.Sequent…

Java | Leetcode Java题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution {public int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;} else if (n % 4 1) {ans 2;n / 2;} else {if (n 3) {ans 2;n 1;} else {ans 2;n n / 2 1;}}}return ans;} }

UE5引擎工具链知识点

当我们提到“引擎工具链的开发”时&#xff0c;通常指的是为游戏开发或其他类型的软件开发创建一系列工具和技术栈的过程。这包括但不限于游戏引擎本身&#xff08;如Unity或Unreal Engine&#xff09;&#xff0c;以及围绕这些引擎构建的各种工具和服务&#xff0c;比如用于构…

CTFHub技能树-Git泄漏-Index

目录 一、Git索引&#xff08;Index&#xff09;的基本概念 二、解题过程 主旨&#xff1a;使用git泄漏恢复源代码 方法一&#xff1a;使用GitHack手动恢复 方法二&#xff1a;直接使用Git_Extract获取网站源代码拿去flag 当前大量开发人员使用git进行版本控制&#xff0c…

新书宣传:《量子安全:信息保护新纪元》

《量子安全&#xff1a;信息保护新纪元》 前言本书的看点本书的目录结语 前言 你好&#xff01; 这是我第一次发布类广告的博文&#xff0c;目的也很单纯&#xff0c;希望以作者的身份介绍一下自己出版的图书——《量子安全&#xff1a;信息保护新纪元》。此书于2024年7月出版…

【鸿蒙】HarmonyOS NEXT星河入门到实战1-开发环境准备

目录 一、达成目标 二、鸿蒙开发环境准备 2.1 开发者工作下载 2.2 解压安装 2.3 运行配置安装node.js和SDK 2.4 开始创建第一个项目 2.5 预览 2.5.1 预览遇到的问题&#xff08;报错&#xff09; 2.5.2 修改内容查看预览 三、备用下载地址&#xff08;如果下载是4.X版…

会声会影2024发布了没有? 会声会影2024更新哪些内容?

嘿&#xff0c;亲爱的的朋友们&#xff0c;今天我要跟大家安利一款让我彻底沉迷、不能自拔的神器 —— 会声会影2024&#xff01;如果你还在为视频编辑头疼&#xff0c;那么准备好迎接你的救星吧&#xff01; 会声会影2024是一款功能全面的视频编辑软件&#xff0c;它不仅能帮你…

基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,系统包含GUI操作界面&#xff0c;系统支持对文字,灰度图,彩色图,语音进行加解密。 2.测试软件版本以及…