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. Pycharm----设置背景颜色和字体的样式

    编辑器默认显示的样式背景为白色,看着会刺眼,也不方便查找我们写的某些参数等,通过设定,可以对页面的样式进行选择更改,方便直观的在编辑器中查看自己所写的代码, 设置前: 设置后 操作方式:

  2. gcc的作用

    把代码编译成二进制文件 预处理----头文件,宏定义展开,条件编译 干掉注释代码 编译成汇编代码 生成目标代码.o (还不能执行) 链接(动态库)生成可执行程序 xxx.out 运行前,内存已经存在分 ...

  3. MySQL建立索引的原则

    1.表的主键.外键必须有索引; 2.数据量超过300的表应该有索引; 3.经常与其他表进行连接的表,在连接字段上应该建立索引; 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; ...

  4. docker起容器配置MySQL主从复制

    https://www.jianshu.com/p/0439206e1f28

  5. SqlBulkCopy插入时:来自数据源的 String 类型的给定值不能转换为指定目标列的类型 int。 ---> System.FormatException: 将参数值从 String 转换到 Int32 失败。 ---> System.FormatException: 输入字符串的格式不正确。

    偶尔间看到的 记录下:https://bbs.csdn.net/topics/390430064

  6. [Luogu] 均分数据

    题面:https://www.luogu.org/problemnew/show/P2503 题解:https://www.zybuluo.com/wsndy-xx/note/1141736

  7. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  8. Hihocoder #1142 : 三分·三分求极值

    1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个 ...

  9. 转义字符\'和\"的使用示例

    /* 转义字符\'和\"的使用示例 */ #include <stdio.h> int main(void) { printf("关于字符串常量和字符常量.\n&quo ...

  10. Ajax请求如何设置csrf_token

    1. 方式一 通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送. $.ajax({ url: "/cookie_ajax/", typ ...