代码随想录图论并查集 第七天 | 685.冗余连接II

代码随想录图论并查集 第七天 | 685.冗余连接II

一、685.冗余连接II

题目链接:https://leetcode.cn/problems/redundant-connection-ii/

思路:684.冗余连接中是连通且无环的无向图可直接使用并查集模板,如果想判断集合中是否有环,且那条边构成环,只需要每次加入并查集之前先判断一下是否有相同的根,有即构成环。

本题是有向图,如果不是树,有两种情况一种是入度为2,如1,21,32,3。3的入度为2删掉一条边即为树。另一种是无入度为2的点,本身来说,本题原集合不是树,如果无入度为2那么就一定构成环了,如1,22,33,1

那么,分为两步,第一步找到入度为2的点,进行删除尝试,如果没有入度为2的点,开始第二步,找到构成环的边。

java 复制代码
class Solution {
    int[] father = new int[1005];;


    public int[] findRedundantDirectedConnection(int[][] edges) {
        int[] inDegree = new int[1005];
        for (int i = 0; i < edges.length; i++) {
            inDegree[edges[i][1]]++;
        }
        List<Integer> list = new ArrayList<>();
        for (int i = edges.length -1; i >= 0 ; i--) {
            if (inDegree[edges[i][1]] == 2) list.add(i);
        }
        if (!list.isEmpty()) {
            if (f1(edges, list.get(0))) return edges[list.get(0)];
            else return edges[list.get(1)];
        }
        return f2(edges);
    }

    boolean f1(int[][] edges, int x) {
        init();
        for (int i = 0; i < edges.length; i++) {
            if (i == x) continue;
            if (isSame(edges[i][0], edges[i][1])) return false;
            else join(edges[i][0], edges[i][1]);
        }
        return true;
    }

    int[] f2(int[][] edges) {
        init();
        for (int[] edge : edges) {
            if (isSame(edge[0], edge[1])) return edge;
            else join(edge[0], edge[1]);
        }
        return null;
    }

    void init() {
        for (int i = 0; i < father.length; i++) {
            father[i] = i;
        }
    }
    int find(int u) {
        if (father[u] == u) return u;
        return father[u] = find(father[u]);
    }
    void join(int u, int v) {
        u = find(u);
        v = find(v);
        if (u == v)return;
        father[u] = v;
    }
    boolean isSame(int u, int v) {
        u = find(u);
        v = find(v);
        return u == v;
    }
}
相关推荐
间歇性努力持续性发呆的野生快乐选手21 分钟前
栈的性质(进栈,出栈,访问)
数据结构·c++
m0_5474866637 分钟前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
xiaohaiAIgeo41 分钟前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
旖旎夜光1 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
小强库计算机毕业设计1 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军1 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐1 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫1 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
kisbad2 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript