Leetcode之并查集专题-684. 冗余连接(Redundant Connection)


在本问题中, 树指的是一个连通且无环的无向图。

输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。

结果图是一个以组成的二维数组。每一个的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。

返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v

示例 1:

输入: [[1,2], [1,3], [2,3]]
输出: [2,3]
解释: 给定的无向图为:
1
/ \
2 - 3

示例 2:

输入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]
解释: 给定的无向图为:
5 - 1 - 2
| |
4 - 3

注意:

  • 输入的二维数组大小在 3 到 1000。
  • 二维数组中的整数在1到N之间,其中N是输入数组的大小。

并查集问题中的最基本的问题,本题中为了不让这个树成环,需要找出最后一条让它成环的路径。

本题是并查集问题的第一题,介绍一下并查集和它的方法。

定义

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。

举个简单的例子来讲:

现在有几个大家族,每个家族有很多个分支,有N个人,分别为1-N,每个人都有自己的祖先。

现在我想知道 A 和 B是否是一个祖先?

1、首先,每个人都有自己的祖先,所以我们用一个数组来存储A的祖先father[A]

2、每个人一开始,自己是自己的祖先。

3、根据输入的数据,对其祖先进行更新或修改。

4、如果需要判断A和B的祖先是否相同,比较father[A]和father[B]的值就可以了。


本题中,我们也可以把这个树的问题,当作是祖先问题。

以示例1为例:

一开始,每个人的祖先是自己,即

father[1] = 1;  father[2] = 2;  father[3] = 3;

第一个数据[1,2]输入:

father[2] = 1;

第二个数据[1,3]输入:

father[3] = 1;

第三个数据[2,3]输入,我们发现2和3的祖先已经不是自己了,即已经指派过祖先给它们了。

所以我们分别求一下2和3的祖先。

father[2] = 1;

father[3] = 1;

发现2和3属于同一个祖先,所以2-3之间这条线不能连接,不然就成环了。

那么,如果2和3的祖先不想等的话呢?

举个例子,2的祖先是4,3的祖先是5,那么我们可以让4的祖先等于5来把它们加入到同一个家族里。

这题还可以路径压缩优化一下:

class Solution {
int[] family ;
public int[] findRedundantConnection(int[][] edges) {
family = new int[edges.length+1];
for (int i = 0; i < edges.length+1; i++) {
family[i] = i;
}
for (int i = 0; i < edges.length; i++) {
int[] temp = edges[i];
int first = temp[0];
int second = temp[1];
int father1 = getFather(first);
int father2 = getFather(second);
if(father1==father2){
return temp;
}else{
family[father1] = father2;
}
}
return new int[2];
}
public int getFather(int i){
int father = family[i];
if(father==i){
return father;
}else{
return getFather(father);
} } }

Leetcode之并查集专题-684. 冗余连接(Redundant Connection)的更多相关文章

  1. Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)

    Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...

  2. [Swift]LeetCode684. 冗余连接 | Redundant Connection

    In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...

  3. Java实现 LeetCode 684 冗余连接(并查集)

    684. 冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, -, N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间 ...

  4. LeetCode:并查集

    并查集 这部分主要是学习了 labuladong 公众号中对于并查集的讲解,文章链接如下: Union-Find 并查集算法详解 Union-Find 算法怎么应用? 概述 并查集用于解决图论中「动态 ...

  5. ZR并查集专题

    ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...

  6. 【LeetCode】并查集 union-find(共16题)

    链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence  (2018年11月22日,开始解决hard题) 给 ...

  7. Leetcode 684.冗余连接

    冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条 ...

  8. 【并查集专题】【HDU】

    PS:做到第四题才发现 2,3题的路径压缩等于没写 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  9. 并查集专题: HDU1232畅通工程

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. mysql数据库NOW()和DATE_FORMAT()日期字段和当前日期作比较

    select * from xxxx where date_format(APPOINTMENT,'%Y-%m-%d-%H-%i-%S') < date_format(now(),'%Y-%m- ...

  2. 一个有趣的 SQL 查询

    来源:站长资讯 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: ********************* ...

  3. win10以及ubuntu下设置pip源

    问题描述:有一段时间下载python库的时候速度非常慢,想着提高安装python库的速度. window10下: 一:首先进入c盘的用户目录,如我的目录为C:\Users\felix. 二:创建名为p ...

  4. electron-vue搭建项目

    原文链接 使用pdf.js插件与LODOP控件实现前端浏览器静默打印PDF文件 lodop官网地址:http://www.lodop.net/download.html 点击下载,文件里有使用手册 e ...

  5. CComboBoxEx添加图像CImageList无法正常显示

    <1>给控件 CComboBox绑定变量 .cpp中 DDX_Control(pDX, IDC_COMBO_PHOTO_IMG, m_ComboBoxPhotoImg); CComboBo ...

  6. Integer int auto-boxing auto-unboxing ==

    Auto-boxing 自动装箱 Auto-unboxing 自动拆箱 == 相等 1.new出来的对象,除非遇到了拆箱的情况,肯定不相等. 因为new对象之前需要在JVM堆中提供空间,所以new出来 ...

  7. 2019.6.28 校内测试 T4 【音乐会】达拉崩吧·上

    考试的一道附加题~ 一看题目描述:把区间[l,r]里每个数异或上x,求区间[l,r]里所有数的异或和,这明显的要用数据结构或RMQ吧. 恩,所以正解就是线段树啦,至于树状数组行与否,不知道~ wate ...

  8. 3.5寸1.44M软盘结构

    结构: 划分: 簇:磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位.在磁盘上,DOS操作系统是以“簇”为单位为文件分配磁盘空间的.硬盘的簇通常为多个扇区,与磁盘的种类.DOS 版本及硬盘分区的大小 ...

  9. leveldb源码分析之Slice

    转自:http://luodw.cc/2015/10/15/leveldb-02/ leveldb和redis这样的优秀开源框架都没有使用C++自带的字符串string,redis自己写了个sds,l ...

  10. ICEM—八分之一球(2D转3D)

    原视频下载地址:https://yunpan.cn/cS3UPRtn5rVwY  访问密码 3d8d