【个人笔记】685. 冗余连接 II 的解释(并查集)

一棵树有n个点和n条边,返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。
解释:
注意不冗余的有根树的特性!**根节点入度为0,其余结点只有一个入度!**所以冗余的两种情况如下:
(1)有一个结点有2个入度(破环其他结点只有一个入度的条件)(可能成环可能不成环)
(2)形成一个每个节点都只有一个入度的环(破环根节点入度为0的条件)(成环)

对于情况(1),找到入度为2的结点(只关注入度)然后返回冗余的边就行了,但是:
1)当不成环时,返回任意一条都行
在这里插入图片描述
2)当成环时,要返回构成环的那条
在这里插入图片描述
所以这里只处理不成环的情况,入度为2时的边记为conflict,并跳过这种可能会导致冗余的边(无论是情况1)的真冗余边还是2)的非冗余边)。把成环的情况合并成到(2)解决。
(所以这里的情况2)出现时,可能造成冗余的边将被跳过)
(a)没去掉真正的冗余边,会出现情况(2)成环
在这里插入图片描述
或者(b)去掉了真正的冗余边,不会出现情况(2)
在这里插入图片描述
对(2),入度不为2的结点需要判定是否成环。如果该结点入度不为2,且属于同一个并查集,说明成环
记录形成有向环的那条边为circle,最后删掉构成环的边就可以了。


由于肯定存在一条冗余边,如果只有circle,那就是circle,如果只有conflict,那就是conflict,如果两个都有,说明是(1)的成环的情况(a)
但是!可能得到circle时是这样!构成环 的临门一脚不一定就是要删的那个,左边那个才是真正要删的!
在这里插入图片描述
所以需要用一个祖先数组ancestors记录“上一个结点”,要找到这个冗余边,就是找 指向edges[conflict][1]的上一个结点
因为只有入度不为2才会更新ancestors,所以ancestors记录的边必然排除了conflict记录的那条。有了ancestors,也不用存入度了,直接:如果ancestors[v]!=v,说明有其他父节点(入度为2)
即:冗余边为
(ancestors[edges[conflict][1]], edges[conflict][1])

class UnionFind{
    int[] parents;

    UnionFind(int l){
        parents = new int[l];
        Arrays.fill(parents, -1);
    }

    int find(int x){
        if (parents[x] < 0) {
            return x; // 如果是根节点,则返回
        }
        // 路径压缩
        return parents[x] = find(parents[x]);
    }

    void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            if (parents[rootX] < parents[rootY]) {  // 负数 <说明rootY下标的结点数更少
                parents[rootX] += parents[rootY];
                parents[rootY] = rootX;  // 小树合并到大树
            }else{
                parents[rootY] += parents[rootX];
                parents[rootX] = rootY;  // 小树合并到大树
            }  // 否则parent[rootX] = parent[rootY],不管
        }
    }
}

class Solution {
    public int[] findRedundantDirectedConnection(int[][] edges) {
        int conflict = -1;  // 冲突(俩父节点)
        int cycle = -1;     // 环

        int[] parent = new int[edges.length];
        for(int i=0; i<edges.length; i++){
            parent[i] = i;   // 要记录指向环路那个!!
        }

        UnionFind uf = new UnionFind(edges.length);
        for(int i=0; i<edges.length; i++){
            int u = edges[i][0]-1, v = edges[i][1]-1;
            if(parent[v]!=v){  // 入度为2
                conflict = i;   // 冲突,v有俩父结点不同的路径
            }else{  // 判断是否成环
                if(uf.find(u)==uf.find(v)){  // 成环
                    cycle = i;
                }else{  // 正常
                	parent[v] = u;  // u是v的父节点
                    uf.union(u, v);
                }
            }
        }
        if(conflict==-1){   // 只存在环路
            return edges[cycle];
        }
        if(cycle==-1){  // 只存在冲突
            return edges[conflict];
        }
        // 都有,则附加的边不可能是 [u,v]
        //(因为[u,v] 已经被记为导致冲突的边,不可能被记为导致环路出现的边),
        // 因此附加的边是 [parent[v],v]。
        int[] res = {parent[edges[conflict][1]-1]+1, edges[conflict][1]};
        return res;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3项目基于Axios封装request请求

在 Vue 3 的项目开发中&#xff0c;使用 Axios 进行 HTTP 请求是非常常见的作法&#xff0c;为了更方便开发者更高效的进行代码编写和项目的维护&#xff0c;可以通过再次封装 Axios 来实现。 在本文中&#xff0c;博主将详细指导你如何在自己的 Vue 3 项目中使用 Axios 二次封…

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问&#xff1a;http://localhost:8080 改动内容重新编译&#xff1a; npm run build dist 目录就是编译后的可运行内容

客流统计系统优化景区服务流程,增强游客满意度

在当今旅游业蓬勃发展的时代&#xff0c;景区面临着越来越多的挑战和机遇。如何提供更优质、更高效的服务&#xff0c;满足游客日益增长的需求&#xff0c;成为了景区管理者们关注的焦点。客流统计系统作为一种创新的技术手段&#xff0c;正逐渐成为优化景区服务流程、增强游客…

windows 打包pyd文件

1.新建一个py文件&#xff0c;myunit.py&#xff0c;里面的代码是: class Adder: def __init__(self, a, b): self.a a self.b b def add(self): return self.a self.b 2.新建一个py文件&#xff0c;setup.py&#xff0c;里面的代码是: from setuptools import setup fro…

巧用通义灵码助力护网面试

前言 前几年护网还算是一个比较敏感的话题&#xff0c;但是随着近段时间的常态化开始&#xff0c;护网行动也是逐渐走进了大众的视野&#xff0c;成为了社会各界共同关注的安全盛事。本篇也是受通义灵码备战求职季活动的启发&#xff0c;结合近期要开始的护网行动&#xff0c…

持续集成06--Jenkins构建触发器

前言 在持续集成&#xff08;CI&#xff09;的实践中&#xff0c;构建触发器是自动化流程中不可或缺的一环。它决定了何时启动构建过程&#xff0c;从而确保代码变更能够及时地得到验证和反馈。Jenkins&#xff0c;作为业界领先的CI/CD工具&#xff0c;提供了多种构建触发器选项…

2.I/O口

I/O输出(点灯) 分析电路 看电路图&#xff0c;元器件形成电压差&#xff0c;即可点亮LED灯 代码编写 使用不同操作进行LED控制 #include "reg52.h" //51单片机头文件 #include <intrins.h> sbit LED1 P1^0; //引脚初始化&#xff1a;P1^0&#xff1a;对应引脚…

RocketMQ~架构与工作流程了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…

字符串类中的常用方法

1 string对象的创建 静态创建 String s1  "abc";  String s2  "abc";  动态创建 String s3  new String("abc"); String s4  new String("abc"); 2string对象的不可变性 任何一个String对象在创建之后都不能对它的…

甲方建设项目的数智化管理

在军工、石化、电力、民航、食品等大型集团企业和政府机构中&#xff0c;基建、IT、技改等各类固定投资项目属于甲方建设型项目。这类项目无论是EPC总包还是按合同分包&#xff0c;都具有业主型、项目干系人多、跨组织协作频繁、全生命周期管理复杂等特点。如何高效地管理这些甲…

基于LAMMPS模拟岩石表面润湿性

润湿性是指不相混的两相流体与岩石固相表面接触时&#xff0c;其中一相流体沿着岩石表面铺开的现象&#xff0c;该相称为润湿相。润湿性一般采用接触角法来确定&#xff0c;通常根据水在固体表面的角度θ来定义系统的润湿性&#xff0c;接触角为0&#xff5e;75为水润湿&#x…

gihub导入gitee仓库实现仓库同步

昨天在GitHub里导入了gitee仓库&#xff0c;但是在仓库同步这里卡了很久&#xff0c;因为网上大多数都是从github导入gitee&#xff0c;然后github生成token放入实现同步&#xff0c;但是我找到一种更为方便的&#xff01; 1.首先找到项目文件下的.git文件里的config文件 2.在…

C++ | Leetcode C++题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();// L 和 R 分别表示左右两侧的乘积列表vector<int> L(length, 0), R(length, 0);vector<int> answer(l…

求解答word图标变白

把WPS卸载了之后就变成白色了&#xff0c;然后在注册表中把word的地址改成office word的地址之后图标变成这样了&#xff0c;怎么办

在国产芯片上实现YOLOv5/v8图像AI识别-专栏目录及必备知识点及相关设备

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 学习本专栏内容需要准备以下硬件设备&#xff1a; 1、RK3588开发板 2、带有 显…

《藏语翻译通》App功能升级,支持藏文词典在线查单词!iPhone用户推荐使用的藏语学习工具!

《藏语翻译通》App上线了藏文词典查单词功能&#xff0c;该功能可以帮助你更有效地学习藏语&#xff0c;以及掌握工作中涉及到的专业术语。本次更新提供了藏汉词典、藏汉大词典、新术语在线查单词功能。 打开App Store搜索关键词&#xff1a;藏文词典 下载这个官方软件 点击首…

leetcode94. 二叉树的中序遍历,递归法+迭代法。附带前序遍历方法

leetcode94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; …

<数据集>猫狗识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3686张 标注数量(xml文件个数)&#xff1a;3686 标注数量(txt文件个数)&#xff1a;3686 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…

揭秘物联网“心脏“:智能控制器的无限可能

在飞速发展的物联网时代&#xff0c;我们身边的智能设备越来越多&#xff0c;从智能家居到工业自动化&#xff0c;从智能交通到智慧城市&#xff0c;这些设备的背后&#xff0c;都离不开一个至关重要的“心脏”——物联网智能控制器。那么&#xff0c;这个神秘的控制器究竟有何…

计算机网络——网络层(IP地址与MAC地址、地址解析协议ARP、IP数据报格式以及转发分组、ICMP、IPV6)

IP地址与MAC地址 由于MAC地址已固化在网卡上的ROM 中&#xff0c;因此常常将 MAC地址称为硬件地址或物理地址&#xff1b;物理地址的反义词就是虚拟地址、软件地址或逻辑地址&#xff0c;IP地址就属于这类地址。 从层次的角度看&#xff0c;MAC地址是数据链路层使用的地址&…