2022-03-15:给定一棵树的头节点head,原本是一棵正常的树, 现在,在树上多加了一条冗余的边, 请找到这条冗余的边并返回。
2022-03-15:给定一棵树的头节点head,原本是一棵正常的树,
现在,在树上多加了一条冗余的边,
请找到这条冗余的边并返回。
答案2022-03-15:
1.指向头,入度没有0的。入度没有2的。
2.未指向头,某一个点入度一定是2。
2.1.左右双全是父节点,另一个不全的不是父节点。
2.2.如果都不全,任选一个。
并查集。如果边两边的点在同一个集合,说明是冗余的。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
edges := [][]int{{1, 2}, {1, 3}, {2, 3}}
ret := findRedundantDirectedConnection(edges)
fmt.Println(ret)
}
func findRedundantDirectedConnection(edges [][]int) []int {
// N是点的数量
// 点的编号,1~N,没有0
N := len(edges)
// 并查集!N个点,去初始化,每个点各自是一个集合
uf := NewUnionFind(N)
// pre[i] = 0 来到i节点是第一次
// pre[i] = 6 之前来过i,是从6来的!
pre := make([]int, N+1)
// 如果,没有入度为2的点,
// first second 都维持是null
// 如果,有入度为2的点,那么也只可能有一个
// 比如入度为2的点,是5
// first = [3,5]
// second = [12,5]
var first []int
var second []int
// 有没有环!非常不单纯!含义复杂!
var circle []int
for i := 0; i < N; i++ { // 遍历每条边!
from := edges[i][0]
to := edges[i][1]
if pre[to] != 0 { // 不止一次来过to!
first = []int{pre[to], to}
second = edges[i]
} else { // 第一次到达to,
pre[to] = from
if uf.same(from, to) {
circle = edges[i]
} else {
uf.union(from, to)
}
}
}
// 重点解析!这是啥???
// first != null
// 有入度为2的点!
return twoSelectOne(first != nil, twoSelectOne(circle != nil, first, second), circle)
}
func twoSelectOne(c bool, a, b []int) []int {
if c {
return a
} else {
return b
}
}
type UnionFind struct {
f []int
s []int
h []int
}
func NewUnionFind(N int) *UnionFind {
ans := &UnionFind{}
ans.f = make([]int, N+1)
ans.s = make([]int, N+1)
ans.h = make([]int, N+1)
for i := 0; i <= N; i++ {
ans.f[i] = i
ans.s[i] = 1
}
return ans
}
func (this *UnionFind) find(i int) int {
hi := 0
for i != this.f[i] {
this.h[hi] = i
hi++
i = this.f[i]
}
for hi > 0 {
hi--
this.f[this.h[hi]] = i
}
return i
}
func (this *UnionFind) same(i, j int) bool {
return this.find(i) == this.find(j)
}
func (this *UnionFind) union(i, j int) {
fi := this.find(i)
fj := this.find(j)
if fi != fj {
if this.s[fi] >= this.s[fj] {
this.f[fj] = fi
this.s[fi] = this.s[fi] + this.s[fj]
} else {
this.f[fi] = fj
this.s[fj] = this.s[fi] + this.s[fj]
}
}
}
执行结果如下:

2022-03-15:给定一棵树的头节点head,原本是一棵正常的树, 现在,在树上多加了一条冗余的边, 请找到这条冗余的边并返回。的更多相关文章
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- PSP(16/03/14-16/03/15)
//整理了自己过去的时间记录文件,最早用电子版记录是15/04/21,依旧断断续续记录到15/11/21,每月至少三次记录,然而自己并没有对数据进行整理,只是纯粹记录,真是浪费了花在上面的时间.期间八 ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- 直径上的乱搞 bzoj1999求树直径上的结点+单调队列,bzoj1912负权树求直径+求直径边
直径上的乱搞一般要求出这条直径上的点集或者边集 bzoj1999:对直径上的点集进行操作 /* 给出一颗树,在树的直径上截取长度不超过s的路径 定义点u到s的距离为u到s的最短路径长度 定义s的偏心距 ...
- kafka如何实现高并发存储-如何找到一条需要消费的数据(阿里)
阿里太注重原理了:阿里问kafka如何实现高并发存储-如何找到一条需要消费的数据,kafka用了稀疏索引的方式,使用了二分查找法,其实很多索引都是二分查找法 二分查找法的时间复杂度:O(logn) ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解
笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func& ...
- HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】
Minimum Cut Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
- 树链剖分(附带LCA和换根)——基于dfs序的树上优化
.... 有点懒: 需要先理解几个概念: 1. LCA 2. 线段树(熟练,要不代码能调一天) 3. 图论的基本知识(dfs序的性质) 这大概就好了: 定义: 1.重儿子:一个点所连点树size最大的 ...
- 基于EasyUi ComBotree树修改 父节点选择问题
本人在使用 Easy UI 期间发现了一个不太适合项目的bug,可能也不算bug把 . 毕竟不同项目背景 取舍不同. 我在做网元树选择的时候 发现当选取父节点后,子节点都会被选择 返回 .但是如 ...
随机推荐
- SpringBoot之基于idea搭建ssm(maven)
此次目标为搭建一个简单的基于springboot的ssm(spring + springmvc + mybatis)的maven项目,使用的数据库为mysql. 最终项目目录结构 创建过程 1.项目创 ...
- CSS pointer-events 属性
pointer-events 属性用于设置元素是否对鼠标事件做出反应. CSS 语法 pointer-events: auto|none; 属性值 属性值 描述 auto 默认值,设置该属性链接可以正 ...
- 👋 和我一起学【Three.js】「初级篇」:0. 总论
「和我一起学 XXX」是我 2023 年的一个新企划,目的是向读者(也包括未来的自己)介绍我正在学习的某项新技术.文章会通过长期反复迭代的方式保持其内容的新鲜度.文章有较大内容更新时,会在文章开头进行 ...
- ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- IDEA中,如何将本地项目推送到Github里面
具体步骤 1.File->VCS->Create Git Repository 然后进入这样一个界面: 接着我们选中当前项目作为本地库: 设置好之后,我们会发现,项目文件全部标红,这是由于 ...
- java.lang.StackOverflowError错误的解决方法
对于java.lang.StackOverflowError认识 如下图所示,报出来这种错误的话,很大概率是有以下几种原因: 现在来看一看我的报错界面: 不难看出,这是无限循环的那种情况,所以,我就去 ...
- Prometheus Operator 与 kube-prometheus 之一-简介
简介 Prometheus Operator Prometheus Operator: 在 Kubernetes 上管理 Prometheus 集群.该项目的目的是简化和自动化基于 Prometheu ...
- C++/Qt网络通讯模块设计与实现(五)
在C++/Qt网络通讯模块设计与实现(四)中具体分析了Qt的信号槽.线程相关的知识,即从 Qt::ConnectionType,示例源码,结果论证,归纳总结等四个方面进行了全方面讲解,深刻阐述了代码设 ...
- 11.getshell常见思路与技巧
getshell常见思路与技巧 1.常规打点思路 信息收集: 绕开CDN找到所有靶标的真实IP 找到所有目标真实的C段 对所有的C段进行基础服务器的探测,端口的扫描.识别 对所有目标的子域名进行收集 ...
- MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引
MySQL 中的索引 前言 索引的实现 哈希索引 全文索引 B+ 树索引 索引的分类 聚簇索引(clustered index) 非聚簇索引(non-clustered index) 联合索引 覆盖索 ...