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把 . 毕竟不同项目背景 取舍不同. 我在做网元树选择的时候 发现当选取父节点后,子节点都会被选择 返回 .但是如 ...
随机推荐
- git Permission denied, please try again.
博主在github上下载tiny face的的源代码的时候,遇到git clone命令为:git clone --recursive git@github.com:peiyunh/tiny.git 而 ...
- Neo4j学习(2)--简单入门
1.Neo4j属性图数据模型 节点:包含多个属性和标签.一个节点就是一条数据 属性:键值对形式 关系:单向与双向,连接节点,也可包含多个属性和标签 标签:表示节点和关系的类型,可以有多个,同时可以通过 ...
- 《MySQL是怎样运行的》第一章小结
- GO语言学习笔记-反射篇 Study for Go ! Chapter nine - Reflect
持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs ...
- Vue前端框架的基础学习,为之后打个基础
Vue 首先,在使用vue之前,我们需要先下载好一个vue.js文件,才能继续进行vue的学习,下载教程如下: 1.进入官网:https://v2.vuejs.org/ 2.选择页面中的Learn,再 ...
- nginx+lua+openresty+kafka相关问题汇总
这里使用的是kafka插件是doujiang大佬的https://github.com/doujiang24/lua-resty-kafka,版本为v0.2.0. 应用场景 在nginx转发中,记录非 ...
- el与data的两种写法
el的两种写法 Vue初始化(被创建)后会判断有无el 有el:创建Vue实例对象的时候配置el属性 无el:通过vm.$mount('#root')指定el的值 data的两种写法 对象式:data ...
- CF309E 题解
11:30,过题.12:50,忘记做法. 吃饭时不该看未来日记的,Ynoj 害人不浅(确信). 以上为个人吐槽. 题目大意 不知道题目翻译是个啥...但讨论区有大佬给出了精确的翻译.我改得符合题目背景 ...
- 学习在UMG中创建列表(List View)
原理 列表中的元素被称为 "Item",每个Item都是一个UObject.你需要为列表指定它的Entry.Entry也是个控件蓝图,它指定了针对于一个Item,它的界面是什么样子 ...
- vuex记录状态
// actions import { queryProductDetailsById } from '../service' /* * 异步 */ export const addAndGetPro ...