Leetcode685 冗余连接II 题解思路及实现

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026 YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_FSD创新模块进行改进) 阅读详情

题目

在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。
输入一个有向图,该图由一个有着 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

思路

形成有根树的条件:

  • 非根节点有且仅有一个父节点
  • 根节点没有父节点

那么产生附加冗余边的情况有:

  • 非根节点有两个父节点 -> 可能有环也可能无环
  • 根节点拥有父节点 -> 一定存在环

记第一种情况为导致冲突的边,第二中情况为导致环路的边,由于附加边只有一条,需要在两种边中进行判断。
若图中没有产生环路:一定发生了冲突,断冲突边
若图中存在环路: 既有环路又有冲突,断环路边;只有环路没有冲突,断开环路中任一条边

从出入度角度考虑:

有根树

  • 根节点:入度为0,出度>=1
  • 非根节点:入度为1

冗余情况

  • 产生冲突没有环路:存在一个节点的入度为2
  • 产生冲突存在环路:存在一个节点的入度为2且该节点入度的两边一条为环路边,一条为冲突边
  • 无冲突存在环路:除以上情况外的剩余情况,环路上节点的入度为1,出度>=1

方法

采用并查集,并查集常常用来判断图中是否存在环

代码实现

class Solution {
    public int[] findRedundantDirectedConnection(int[][] edges) {
        int n = edges.length;
        int[] res = new int[2];
        int[] fa = new int[n + 1];
        int[] indegree = new int[n + 1];
        int[] outdegree = new int[n + 1];
        for(int i = 0; i < n + 1; i++){
            indegree[i] = 0;
            outdegree[i] = 0;
        }
        for(int i = 0; i < n; i++){
            indegree[edges[i][1]]++;
            outdegree[edges[i][0]]++;
        }
        //存在冲突边
        int node1 = -1;
        for(int i = n; i > 0; i--){
            if(indegree[i] > 1){
                node1 = i;
                break;
            }
            
        }
        
        List<Integer> list = new ArrayList<>();
        
        for(int i = n - 1; i >= 0; i--){
            if(edges[i][1] == node1){
                list.add(i);
            }
        }   
        
        for(int i = 0; i < list.size(); i++){
            //删除入度节点为2的节点对应的两条边中任一条,判断此时是否能构成有根树
            if(isTreeAfterDelete(edges, fa, n, list.get(i))){
                return edges[list.get(i)];
            }

        }

        //不存在冲突但存在环路

        List<Integer> node2 = new ArrayList<>();
       
        for(int i = n; i > 0; i--){
            if(indegree[i] > 0 && outdegree[i] >= 1){
                //node2存放环路中的每个节点
               node2.add(i);
                 
            }
        
        }
        List<Integer> list2 = new ArrayList<>();
        
        for(int i = n - 1; i >= 0; i--){
            for(int j = 0; j < node2.size(); j++){
                if(edges[i][0] == node2.get(j)){
                list2.add(i);
            }

            }
            
        }    
        
        for(int i = 0; i < list2.size(); i++){
            if(isTreeAfterDelete(edges, fa, n, list2.get(i))){
                return edges[list2.get(i)];
            }

        }

        return res;    
        
    }

    void init(int[] fa, int n){
        for(int i = 0; i < n; i++){
            fa[i] = i;
        }
    }

    int find(int[] fa, int i){
        if(fa[i] == i) return i;
        fa[i] = find(fa, fa[i]);
        return fa[i];
    }

    void join(int[] fa, int i, int j){
        int v = find(fa, i);
        int u = find(fa, j);
        if(v == u) return;
        fa[u] = v;
    }

    boolean same(int[] fa, int i, int j){
        int v = find(fa, i);
        int u = find(fa, j);
        return v == u;
    }

    boolean isTreeAfterDelete(int[][] edges, int[] fa, int n, int deleteEdge){
        init(fa, n + 1);
        for(int i = 0; i < edges.length; i++){
            if(i != deleteEdge){
                int s = edges[i][0];
                int d  =edges[i][1];
                if(same(fa, s, d)){
                    return false;
                } else {
                    join(fa, s, d);
                }
            }
        }
        return true;
    }
}
国科大《人工智能原理与算法》2021年期末试题+2024经验(2025指南) 2021年期末试题+24年复习指南 阅读详情

相关推荐

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 728

LeetCode 685.冗余连接 II 题解

输入一个有向图,该有向图是由n个节点组成的树和一条附加有向边构成。返回一条能删除的边,使得剩下的图是有n个节点的有根树;有根树指满足以下条件的有向图:该树只有一个根节点,所有其他节点都是该根节点的后继。该树除根节点之外的每一个节点都有且只有一个父节点,根节点没有父节点。由此可以分两步进行:在出现结果一时,找出节点入度为2的点,这个点是两条有向边的head点,找出这两条边。原有向图本来是一颗树,在此前提下添加了一条边使得有向图不再是一颗树。在出现结果二时,利用基础查并集方法找到最先无法join的边,输出。

m0_67504012的博客 1289

深入解析ViT中的RoPE旋转位置编码:原理、实现与视觉应用

本文深入解析了ViT中的RoPE旋转位置编码原理、实现及其在视觉任务中的应用。RoPE通过旋转变换巧妙地将相对位置信息融入注意力计算,解决了传统绝对位置编码外推性差的问题,在图像分类、目标检测及生成任务中展现出更优的泛化能力和灵活性。

alice7model的博客 706

【算法与数据结构】684、685、LeetCode冗余连接I II

所有的LeetCode题解索引,可以看这篇文章——。

晚安的博客 1392

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计)

本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。

weixin_30315723的博客 418

手把手教你用Payload Dumper工具,把官方卡刷包变成线刷包救砖(附Fastbootd进入方法)

本文详细介绍了如何使用Payload Dumper工具将官方卡刷包转换为线刷包进行救砖操作。通过提取payload.bin文件中的分区镜像,并利用fastbootd模式完成刷写,帮助用户解决安卓设备系统故障问题。文章包含环境搭建、工具使用、常见问题解决方案等实用内容,适合需要刷机救砖的用户参考。

weixin_42639246的博客 617

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图) 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。 输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。附加的边包含在 1 到 n 中的两个不同顶点间,这条附加的边不属于树中已存在的边。 结果图是一个以边组成的二维数组 edges 。 每个元素是

<font color="Pink">Tisfy的博客</font> 1262

基于Isaac Gym与PPO算法的机械臂抓取任务仿真与强化学习实战(附完整代码与训练策略)

本文详细介绍了基于Isaac Gym与PPO算法的机械臂抓取任务仿真与强化学习实战。通过环境搭建、PPO算法实现、奖励函数设计等核心环节的优化,结合完整代码与训练策略,显著提升机械臂抓取效率与成功率。特别适合开发者快速掌握强化学习在机器人控制领域的应用。

weixin_29256771的博客 600

Leecode冗余连接

树可以看成是一个连通且的图。给定往一棵n个节点 (节点值1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在1到n中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为n的二维数组edges表示图中在ai和bi之间存在一条边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着n个节点的树。如果有多个答案,则返回数组edges中最后出现的那个。

ziyuexuan2020的博客 1542

断层错动和近断层地震动联合作用下软岩隧洞衬砌损伤分析

摘要 本文提出了一种基于Python的软岩隧洞衬砌损伤分析系统,重点研究断层错动和近断层地震动的联合作用效应。系统采用有限元方法建立隧洞-围岩体系模型,通过非线性动力分析评估衬砌结构损伤。研究内容包括:1)建立考虑应变软化的软岩本构模型;2)基于位错理论模拟断层错动过程;3)合成具有速度脉冲效应的近断层地震动;4)开发完整的动力响应分析流程。结果表明,所提出的方法能有效评估软岩隧洞在复杂地质条件下的抗震性能,为工程设计提供理论依据。 关键词:软岩隧洞、断层错动、近断层地震动、损伤分析、Python、有限元法

max500600的博客 842

KEPServerEX作为MQTT客户端

打开软件: 测试没有连接上MQTT代理。

低码开发 1681

Leetcode-并查集-685. 冗余连接 II

题目: 在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。 输入一个有向图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。 结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [u, v],用以表示有向图中连接顶点 u 和顶点 v 的边,其中 u 是 v 的一个父节点。 返回一条能删除的边,

一只菜鸟夹 440

RedCap:一种通信技术的概述

总结起来,RedCap是一种基于数据包交换的通信技术,它提供了一种高效、可靠的数据传输机制。通过使用RedCap,我们可以轻松地发送和接收数据包,并确保数据的完整性和正确性。在上面的示例中,我们首先导入了RedCap库,并创建了一个RedCap实例。然后,我们定义了目标地址和源地址,并创建了一个数据包,其中包含了目标地址、源地址和要发送的数据。本文将介绍RedCap的基本原理和使用方法,并提供一些相关的源代码示例。RedCap还提供了其他一些功能,如数据包的重传机制、流量控制和拥塞控制等。

YgjWeb的博客 900

力扣题解(冗余连接)

如果有冲突,那要进一步判断,首先通过冲突记录的下标,可以得知被指向的点是V,冲突边是 U->V,而原本用的边是parent[V]->V,对于原本用的边,如果此时还有环,那么一定是原本用的边导致的,因为U->V这条边不能又去冲突又去形成环,那么要去除的边就是parent[V]->V,反之,若没有形成环,要去掉的边就是U->V;对于有向的情况,可能要删除的边会导致两种情况:一种是形成一个大环路,首位连接那种,此时每个点都有且只有一个父节点。分别记录出现环的时候的边的下标和出现冲突的时候的边的下标。

yyssas的博客 477

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Leetcode 685.冗余连接II(困难)

题目 题解 并查集 思路 相比于 无环五向 的问题 684.冗余连接,本题是 有向 图。 且题目说明了每个节点都只有一个父节点,除了根节点没有父节点,因此在多加了一条附加的边之后,可能导致的情况有两种: 附加的边指向根节点,则包括根节点在内的每个节点都有一个父节点,此时图中一定有环路; 附加的边指向非根节点,则恰好有一个节点(即被附加的边指向的节点)有两个根节点,此时图中可能有环路也可能没有环路。 要找到附加的边,需要遍历图中的所有边构建出一棵树,在构建树的过程中寻找导致冲突(即导致一个节点有两个父节点

明朗晨光的专栏 586

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【leetcode】685. 冗余连接 II(redundant-connection-ii)(dfs)[困难]

链接 https://leetcode-cn.com/problems/redundant-connection-ii/ 耗时 解题:1 h 51 min 题解:-48+3 min 题意 在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。 输入一个有向图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。 结果图

Krone_的博客 232

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

leetcode **685. 冗余连接 II(并查集)(待深究)(2020.9.17)

【题目】**685. 冗余连接 II 在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。 输入一个有向图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。 结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [u, v],用以表示有向图中连接顶点 u 和顶点 v 的边,其中 u 是 v 的一个父节点。 返

Sophia_fez的博客 484

leetcod 685. 冗余连接 II

输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui 是 vi 的一个父节点。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。输入:edges = [[1,2],[2,3],[3,4],[4,1],[1,5]]输入:edges = [[1,2],[1,3],[2,3]]

pige666的博客 646

LeetCode题解系列--685. Redundant Connection II

描述In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) for which all other nodes are descendants of this node, plus every node has exactly one parent, exce

Bowen_Wu_的博客 1827

LeetCode 685. Redundant Connection II

原题链接在这里:https://leetcode.com/problems/redundant-connection-ii/ 题目: In this problem, a rooted tree is adirectedgraph such that, there is exactly one node (the root) for which all other nodes are de...

weixin_30485291的博客 106

lc685.冗余连接II【和并查集有关,主要是分析附加边的几种情况】

官方题解https://leetcode-cn.com/problems/redundant-connection-ii/solution/rong-yu-lian-jie-ii-by-leetcode-solution/ 核心思路: class Solution { public: vector<int> findRedundantDirectedConnection(vector<vector<int>> edges){ ...

sankuaizhuobu的博客 257

LeeCode 685 dfs + 并查集

题意 传送门 LeeCode 685 题解 此时图中一定出现环。 考虑所有节点度都小于等于 111 的情况,此时环首尾相连,环上任意边均为可能答案,取索引值最大的即可;用并查集合并节点,第一次出现两端节点连通的边即答案。 考虑存在度为 222 的结点的情况,此时答案为指向该节点的边之一;枚举删边,从根节点 dfs 即可,若不能遍历全部节点,则当前删除边非答案;若 222 条边枚举删除后 dfs 都...

neweryyy的博客 143

算法设计与分析第二次作业(leetcode 中 Redundant Connection问题求解)

随便写写 上周说过了,自己写了一个Redundant Connection II的题目,难度级别是hard的,但是看了评论区网友的解答自己又做了答案之后觉得挺简单的,就准备随便给个博客写一下(就不当做作业的博客了)。但是后来发现这个题还有一个无向图的版本Redundant Connection,仍然采用Redundant Connection II类似的做法,发现无法通过测试,我把错误样例分析了...

ousuixin的博客 667

leetcode日常刷题

最大子序和 53 给定一个整数数组&nbsp;nums&nbsp;,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 题目要求实现复杂度O(n)的解法,尝试使用更为精妙的分治法求解。 复杂度O(n)的做法是,设两个变量cursum和res,前者存放当前和的最大者,即之前的累加值加上当前位置的值,和当前位置的值之间的较大值。res存放当前序列的最大序列和的值。 ...

LINDA 379

LeetCode-数据结构

文章目录长见识的方法分类归纳整理栈堆排序思路动态规划贪心算法位运算树图递归并查集动态规划基础知识总结卡特兰数并查集 长见识的方法 前缀和+状态压缩=>1371.每个元音包含偶数次的最长子字符串 中心扩展法 => 5.最长回文子串 判断两个区间是否可以合并 => 57.插入区间 顺时针扫描矩阵=> 29. 顺时针打印矩阵 Boyer-Moore 投票算法 => 169. 多数元素 识别排序数组中两个交换元素 => 99. 恢复二叉搜索树 Morris 中序遍历 =>

strdhgthbbh的博客 1959

一些不常见但很好用的数据结构

并查集、树状数组、拓扑排序

qq_41936898的博客 354
上一篇: 《算力网络中高效算力资源度量方法》论文解读与实验复现
下一篇: 《Mobility-Aware Computation Offloading in Edge Computing Using Machine Learning》 论文阅读笔记一
code120302
博客等级 码龄7年 195粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值