684. 冗余连接——经典并查集题目

684. 冗余连接

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

输入一个图,该图由一个有着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是输入数组的大小。
class Solution(object):
    def findRedundantConnection(self, edges):
        """
        :type edges: List[List[int]]
        :rtype: List[int]
        """
        self.init(len(edges))
        ans = []
        for u,v in edges:
            is_success, e2 = self.connect(u, v)
            if not is_success:
                ans = e2
        return ans

    def init(self, N):
        self.father = {}
        for i in range(1, N+1):
            self.father[i] = i

    def connect(self, u, v):
        f1 = self.find_father(u)
        f2 = self.find_father(v)
        if f1 == f2:
            return False, [u, v]
        else:
            self.father[f1] = f2
            return True, []

    def find_father(self, u):
        root = u
        path = []
        while self.father[root] != root:
            path.append(root)
            root = self.father[root]
        for p in path:
            self.father[p] = root
        return root

原文地址:https://www.cnblogs.com/bonelee/p/12678756.html

时间: 2024-10-10 07:46:31

684. 冗余连接——经典并查集题目的相关文章

【并查集题目总结】

[并查集题目总结] 问题一:并查集森林的连通分支数(经典,pre[ i ] == i ?) http://acm.hdu.edu.cn/showproblem.php?pid=1232 问题二:并查集森林所有连通分支最大元素个数(维持一个cnt[ ]数组) http://acm.hdu.edu.cn/showproblem.php?pid=1856 问题三:构造并查集森林过程中计数不能成环的边数(成环 等价于 根节点相同) http://acm.hust.edu.cn/vjudge/proble

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

在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边. 结果图是一个以边组成的二维数组.每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边. 返回一条可以删去的边,使得结果图是一个有着N个节点的树.如果有多个答案,则返回二维数组中最后出现的边.答案边 [u, v] 应满足相同的格式 u < v.

poj 1611 :The Suspects经典的并查集题目

Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others.   In the Not-Spr

HDU 5652 India and China Origins(经典并查集)

特别经典的一个题,还有一种方法就是二分+bfs 题意:空间内n*m个点,每个点是0或者1,0代表此点可以走,1代表不能走.接着经过q年,每年一个坐标表示此点不能走.问哪年开始图上不能出现最上边不能到达最下边的情况了 图上连通性可以使用并查集判断,但是并查集不善于删边,却善于添边.所以我们倒着来想就是离线倒序添边(横向并查,再纵向并查),当某次判断时图已经连通,就结束. 我使用二维并查集,其实就是使用结构体代替一维数组.接着就是每次一定要从x轴小的点到达x轴大的点,最后注意添边时,我们需要此点向四

并查集题目从入门到入土

2017-09-01 并查集一个神奇的算法 今天我们的s同学想学习一下并查集,就去找了几个水题刷一下... 入门题_1:P2839 畅通工程 畅通工程 就是求联通块的数量,-1就是答案. #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int read(){ int f=1,an=0; char ch=getchar(); while(!('0'<=ch&

冗余关系_并查集

冗余关系 蒜头最近在沉迷小说,尤其是人物关系复杂的言情小说.它看到的人物关系描述得很的麻烦的时候觉得非常蒜疼,尤其是任务关系里有冗余的时候.什么是冗余关系呢? 这篇小说里有n句描述人物关系的句子,描述了n个人的关系. 每条句子的定义是这样的: X<->Y    它的意思是:X认识Y,Y也认识X 我们认为小说中的人物关系是具有传递性的,假如A认识B,B认识C,则A也认识C. 冗余关系的定义:就是即使没有这条人物关系,原来的人物之间的所有关系也照样成立. 比如: 小说中已经提到了A认识B,B也认识

并查集题目整理

并查集 之前写最小生成树的时候对这一部分的知识也并没有十分详细的整理 近天做了一些用到并查集的题目,来整理一下 知识回顾 首先,先来回顾一下有关并查集的内容 <1> 定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. <2>初始化 把每个点所在集合初始化为其自身. 通常来说,这个步骤在每次使用该数据结构时只需要执行

并查集题目

POJ 1611 The Suspects 题意是n个人,m组数,每组数的第一个数k表示这组数有k个数,求所有与0直接或间接有关系的数. 建立它们之间的关系后,只要查询下最终的根是0的个数就行,当然两个数中只能最小的数当根. 代码如下: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int maxn = 3e4+10; 5 int fa[maxn], rank[maxn]; 6 in

poj 2236 网络连接问题 并查集

题意:n台电脑,当两台之间的距离小于d的时候可以连接. 题目会进行操作"修复"还有"查询是否已经连接".只要在查询的时候输出YES或者ON 思路: 把可以相互连接的 即两者之间的距离小于 d  q[i].push_back(j) 还有 q[j].push_back(i)  这里面的q为动态数组 q[i]存储的是可以与i相连的机器 每台机器的初始根节点为i 修复操作的时候,进行更改根节点,如果i,j都已经被修复了,那么i j就可以连到同一个根节点上面 查询操作的时候,