【LeetCode】684. Redundant Connection 解题报告(Python & C++)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/redundant-connection/description/
题目描述
In this problem, a tree is an undirected graph that is connected and has no cycles.
The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, …, N), with one additional edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed.
The resulting graph is given as a 2D-array of edges. Each element of edges is a pair [u, v] with u < v, that represents an undirected edge connecting nodes u and v.
Return an edge that can be removed so that the resulting graph is a tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. The answer edge [u, v] should be in the same format, with u < v.
Example 1:
Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: The given undirected graph will be like this:
1
/ \
2 - 3
Example 2:
Input: [[1,2], [2,3], [3,4], [1,4], [1,5]]
Output: [1,4]
Explanation: The given undirected graph will be like this:
5 - 1 - 2
| |
4 - 3
Note:
- The size of the input 2D-array will be between 3 and 1000.
- Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array.
题目大意
给出了一个有环无向图的各个边,找出能去除的边,使得这个图不含环(即为树)。
注意,这个图中的各个节点是1~N,总共有N条边,即只多了一条边。
解题方法
并查集
上一次看这个题的时候,我知道使用并查集去做,但是并没有做出来。这次再次心平气和的看的时候,已经能一遍写出来了。
关于并查集,这个知识点有点大。简而言之,告诉你一条边,去集合里查找这条边的两个节点分别属于哪个树。根据是否属于同一个树,做后续的判断。我之前的一篇文章讲述了并查集的一种应用:【九度OJ】题目1012:畅通工程 解题报告。更多的资料,可以看《计算机考研——机试指南》。
下面的代码实现了并查集查找根节点的代码,并且做了路径压缩,防止树太高导致查找根节点缓慢。
具体到这个题,虽然说是返回最后一个边,但我们知道只需要去除一条边就够了,之前的边不会构成环,直至多余的那条边出现。
另外要注意,当一条边的左右节点的根节点不同时,要把他们设置相同,这样等下次判断某条边的左右节点相同的情况时,说明是多余的那条边了。
python代码如下:
class Solution:
def findRedundantConnection(self, edges):
"""
:type edges: List[List[int]]
:rtype: List[int]
"""
tree = [-1] * (len(edges) + 1)
for edge in edges:
a = self.findRoot(edge[0], tree)
b = self.findRoot(edge[1], tree)
if a != b:
tree[a] = b
else:
return edge
def findRoot(self, x, tree):
if tree[x] == -1: return x
else:
root = self.findRoot(tree[x], tree)
tree[x] = root
return root
C++代码如下:
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
const int N = 1001;
m_ = vector<int>(N, 0);
for (int i = 0; i < N; ++i) {
m_[i] = i;
}
for (auto edge : edges) {
if (!u(edge[0], edge[1]))
return edge;
}
return {0, 0};
}
private:
vector<int> m_;
int f(int a) {
if (m_[a] != a)
m_[a] = f(m_[a]);
return m_[a];
}
bool u(int a, int b) {
int fa = f(a);
int fb = f(b);
if (fa == fb)
return false;
m_[fa] = b;
return true;
}
};
日期
2018 年 5 月 28 日 —— 太阳真的像日光灯~
2019 年 1 月 25 日 —— 这学期最后一个工作日
【LeetCode】684. Redundant Connection 解题报告(Python & C++)的更多相关文章
- LN : leetcode 684 Redundant Connection
lc 684 Redundant Connection 684 Redundant Connection In this problem, a tree is an undirected graph ...
- [LeetCode] 684. Redundant Connection 冗余的连接
In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...
- leetcode 684. Redundant Connection
We are given a "tree" in the form of a 2D-array, with distinct values for each node. In th ...
- LeetCode 684. Redundant Connection 冗余连接(C++/Java)
题目: In this problem, a tree is an undirected graph that is connected and has no cycles. The given in ...
- [LeetCode] 685. Redundant Connection II 冗余的连接之 II
In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) f ...
- 【LeetCode】120. Triangle 解题报告(Python)
[LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...
- LeetCode 1 Two Sum 解题报告
LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...
- 【LeetCode】Permutations II 解题报告
[题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...
- 【LeetCode】Island Perimeter 解题报告
[LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...
随机推荐
- 苹果ios通过描述文件获取udid
苹果ios通过描述文件获取udid 需要准备的东西 1,安装描述文件只支持https的回调地址,所以需要申请https域名 2,描述文件签名,不安装也可,只要能接受红色的字 步骤: 1,准备xml文件 ...
- 使用Rainbond实现离线环境软件交付
一.离线交付的痛点 在传统行业,如政府.能源.军工.公安.工业.交通等行业,为了防止数据泄露和运行安全考虑,一般情况下网络会采取内外网隔离的策略,以防范不必要的风险,毕竟在安全防护方面,网络物理隔离是 ...
- Scala(一)【安装和IDEA中开发】
目录 一.下载 二.windows安装 三.linux环境安装 四.Ida开发Scala 1.在线下载Scala插件 2.离线下载Scala插件 3.验证 五.HelloWorld入门程序 1.新建M ...
- Shell学习(四)——shell中各种括号的作用
参考博客: [1]shell中各种括号的作用().(()).[].[[]].{} [2]shell中的单层大/中/小括号.双层大中小括号.命令替换等 一.前言 目录 单括号() 双括号(( )) 单中 ...
- GCD的补充
1-1 关于GCD中的创建和释放 在iOS6.0之前,在GCD中每当使用带creat单词的函数创建对象之后,都应该对其进行一次release操作. 在iOS6.0之后,GC ...
- C# 获取当前目录的父级目录
Directory.GetParent(System.Environment.CurrentDirectory).FullName
- docker容器使用loki收集日志
docker-compose安装loki套件(loki+promtail+grafana) loki进行日志聚合处理 类似elk中的es promtail是日志收集,类似elk中的logstash ...
- C#中继承和多态
1.继承的概念 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用已存在的类的功能. 为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总 ...
- 解放双手,自动生成“x.set(y.get)”,搞定vo2dto转换
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 给你机会,你也不中用啊 这些年从事编程开发以来,我好像发现了大部分研发那些不愿意干的 ...
- 【js基础】基础数据类型变量为啥有属性?
1.变量和数值 let a =1 这是一个简单的变量声明,其中"a"是变量,在代码中供程序员或者语法操作的,而1是数值,是我最终需要的东西.为什么不直接使用数值而使用变量?这个就不 ...