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的websocket因IP问题无法连接
首先遇到这个问题有点奇葩,出现在项目上线时的客户现场,头两天一直都无法确定原因,因为它的表现方式很奇怪,基于springboot实现的websocket,同样的代码在公司研发环境不会有问题,客户现场会 ...
- flask orm 操作方法
数据库操作 常用的查询过滤器 过滤器 说明 filter() 把过滤器添加到原查询上,返回一个新查询 filter_by() 把等值过滤器添加到原查询上,返回一个新查询 limit() 使用指定的值限 ...
- Axios的js文件的下载教程+相关应用
下载教程来啦! 1.进入GitHub网站,网址在这里:http://github.com 2.去搜索框搜索Axios,得到如下界面: 3.然后选择这里: 会出现如下界面: 4.点击右方的绿色按钮&qu ...
- Maven学习笔记1:Maven基本介绍和安装配置
一.认识Maven 官网 http://maven.apache.org/ 上面有最权威的说明,其中包括下载.安装.运行示例,但是是英文版的. Maven是什么 Maven是一个项目管理工具. 它有何 ...
- MyBatisPlus 自动填充演示
一.数据库 表中新增"添加时间"和"修改时间"字段:
- Windows10绿色植物主题Kemikal
给大家分享一个Windows10的主题,Kemikal主题,内置8张绿色植物树木的壁纸.使用这个主题前需要破解系统主题文件. 想要完整的使用这个主题,需要下载安装下方的三个文件: Windows10主 ...
- 解决class path resource [applicationContext.xml] cannot be opened because it does not exist
在学习spring的过程出现class path resource [applicationContext.xml] cannot be opened because it does not exis ...
- $\mathcal{2023WinterHoliday}$刷题总结
\(\mathcal{2023WinterHoliday}\) \(\mathcal{CTF}\) \(\mathcal{web}\) 1.\(json格式:\)$json['x']=="w ...
- window的子对象
在控制台输入 history history.length 历史记录个数history.back() 后退history.forward() 前进history.go(n) 跳到某一页,可正可负,当n ...
- 最新版本 Stable Diffusion 开源 AI 绘画工具之汉化篇
目录 汉化预览 下载汉化插件一 下载汉化插件二 下载汉化插件三 开启汉化 汉化预览 在上一篇文章中,我们安装好了 Stable Diffusion 开源 AI 绘画工具 但是整个页面都是英文版的,对于 ...