Leetcode:684. 冗余连接(并查集C++)

这篇具有很好参考价值的文章主要介绍了Leetcode:684. 冗余连接(并查集C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

684. 冗余连接

题目描述:

实现代码与解析:

并查集

原理思路:


684. 冗余连接

题目描述:

        树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。

示例 1:

Leetcode:684. 冗余连接(并查集C++),Leetcode,leetcode,c++,算法,并查集

输入: edges = [[1,2], [1,3], [2,3]]
输出: [2,3]

示例 2:

Leetcode:684. 冗余连接(并查集C++),Leetcode,leetcode,c++,算法,并查集

输入: edges = [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]

实现代码与解析:

并查集

class Solution {
public:
    int p[1010];
    int find(int x)
    {
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {

        for (int i = 0; i < edges.size() + 1; i++)  p[i] = i; // 初始化
        for (int i = 0; i < edges.size(); i++)
        {
            int a = edges[i][0];
            int b = edges[i][1];
            if(find(a) == find(b)) return edges[i];
            else p[find(a)] = find(b); // 让a的根节点的父亲节点为b的根节点,当然反过来也可以
            
        }
        return {};
    }
};

原理思路:

        并查集是看起来很难,但是是非常简单的算法,,核心代码几行就能搞定,掌握并查集算法,我们只需要了解 p数组的含义 和 find寻根函数 就差不多已经会了。

        我们把并查集的关系抽象成一颗树,相互连接的节点在一颗树上。

        首先 p[x] 数组的含义就是 x 节点的父亲。当 x = p[x] 时,说明其父亲节点就是自己(单独一个节点,没有相连的边),还没有去连接其关系,所以我们在初始化的时候就令其都先指向自己,也就是:

for (int i = 0; i < edges.size() + 1; i++)  p[i] = i; // 初始化

        然后就是 find(x) 函数,是用来寻找 x 节点的根节点(祖宗),并且在寻找根节点时,优化路径,使下次寻找变得非常非常快,是很关键的部分,但是代码却非常短,短短几行代码做到两件事,太优雅了。

    int find(int x)
    {
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }

        具体这个代码是怎么做到的,大家画个图模拟一下就知道了,这里不再讲述。

        假设一条边连接 a 和 b 节点,我们想要这两个含有 a, b节点的部分连接,只需要将a, b其中一个的根节点,作为另一个的父亲节点即可。代码如下:

p[find(a)] = find(b);

当然反过来也是可以的。

        想要判断 a, b两个节点是否联通,只需要看其根节点是否为同一个即可。代码如下:

find(a) == find(b)

        这样这道题就很简单了,我们循环遍历给的edges,若此边加入前,其相连的a, b已经联通,则此边是可以去除的。若a ,b并不联通,我们将a, b联通,进行下一次寻找,直到找到答案。文章来源地址https://www.toymoban.com/news/detail-545224.html

        for (int i = 0; i < edges.size(); i++)
        {
            int a = edges[i][0];
            int b = edges[i][1];
            if(find(a) == find(b)) return edges[i];
            else p[find(a)] = find(b); // 让a的根节点的父亲节点为b的根节点,当然反过来也可以
            
        }

到了这里,关于Leetcode:684. 冗余连接(并查集C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • leetcode 399除法求值 超水带权并查集

    leetcode 399除法求值 超水带权并查集

    题目

    2024年01月19日
    浏览(11)
  • LeetCode-200. 岛屿数量【深度优先搜索 广度优先搜索 并查集 数组 矩阵】

    给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入:grid = [ [“1”,“1”,“1”,“

    2024年04月14日
    浏览(10)
  • 图论|684.冗余连接 685. 冗余连接 II

    684.冗余连接 题目 :树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图

    2024年02月04日
    浏览(10)
  • 代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

    代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

    #查并集理论知识   并查集用处:解决连通性问题 将两个元素添加到一个集合中。 判断两个元素在不在同一个集合 思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通:只需要用一个一维数组来表示,即:father[A] = B,fathe

    2024年02月16日
    浏览(11)
  • C++:合并集合(并查集)

    一共有n个数,编号是1~n,最开始每个数各自在一个集合中。 现在要进行m个操作,操作共有2种: 1.“M a b”,将编号为a和b的两个数的所在的集合合并,如果两个数已经在同一个集合中则忽略这个操作 2.“Q a b”,询问编号为a和b的两个数是否在同一个集合中 第一行输入整数

    2024年02月13日
    浏览(13)
  • 并查集算法实现

    牛客测试链接 并查集(Disjoint Set)是一种用于处理集合合并与查询问题的数据结构。它支持两种操作:合并(Union)和查询(Find)。 合并操作将两个不相交的集合合并为一个集合,查询操作用于判断两个元素是否属于同一个集合。 本文将介绍并查集算法的实现,并给出一个

    2024年01月25日
    浏览(11)
  • 【数据结构与算法】并查集

    【数据结构与算法】并查集

    并查集是一个树形结构,所谓的并查,就是 当我们有了一个节点,我们就能知道这个节点属于哪个集合 。 举个例子理解以下:战国时期有很多国家,它们会互相打仗,那么现在有两个互相不认识的人,如何知道对方是敌是友呢? 现在有一种方法:每个国家都有一个大王,我

    2023年04月15日
    浏览(9)
  • Peter算法小课堂—并查集

    Peter算法小课堂—并查集

    我们先来看太戈编程467题 攀亲戚 题目描述: 最近你发现自己和古代一个皇帝长得很像:都有两个鼻子一个眼睛,你想知道这皇帝是不是你的远方亲戚,你是不是皇亲国戚。目前你能掌握的信息有m条,关于n个人:第i条信息包含两个人的编号ai,bi,表示ai和bi是亲戚。你的编号

    2024年01月18日
    浏览(10)
  • 算法与数据结构(九)--并查集

    算法与数据结构(九)--并查集

    1.处理对象:Disjoint Set,即“不相交集合”。 在一些应用问题中,需将n个不同的元素划分成一组不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定顺序将属于同一组元素的集合合并。其间要反复用到查询某个元素属于哪个集合的运算。适合于描述这类问题的

    2024年02月10日
    浏览(9)
  • 算法刷题day34:并查集

    今天写的题集是并查集,其实感觉有两个难点,一个是,要维护多余的信息和路径压缩,另一个难点则是抽象出来合并集合的这个操作,还是要不断地练习,看别人怎么去做,加油! 标签:并查集 思路: 模板题,没啥说的 题目描述: 示例代码: 标签:并查集 思路: 其实

    2024年03月21日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包