代码随想录day55 || 图论5

news/2024/12/21 23:42:00/文章来源:https://www.cnblogs.com/zhougongjin55/p/18404404

并查集

image

197 图中是否存在有效路径

var father []int
func validPath(n int, edges [][]int, source int, destination int) bool {// 使用并查集算法,涉及到的操作,包括init,find, issample,joinfather = make([]int, n)for i, _ := range father {  // initfather[i] = i}// insertfor _, edge := range edges {join(edge[0], edge[1])}return isSame(source, destination)
}func find(u int) int {if u == father[u] { // 只有根节点的父节点等于自己return u}res := find(father[u]) // res 保存的是多次递归之后最终的根father[u] = res // u是查询的节点,father[u] 含义是u的父节点,father[u] = res,代表将u的父节点指向根,这里操作就是路由压缩return res
}func join(u, v int) {// 先拿到u,v的根节点,不能直接对比find(u) == find(v), 因为下面还有赋值操作u = find(u)v = find(v)if u == v {return}father[u] = v
}func isSame(u, v int) bool {if find(u) == find(v) {return true}return false
}

684 冗余连接


var father []int
var res []int
func findRedundantConnection(edges [][]int) []int {// 考察并查集知识,什么叫做冗余连接呢?就是并查集中出现的路径压缩,2->1, 3->1, 3->2==>2的根是1,3的根也是1,已经再同一集合, 这就是冗余连接// 所以本题思路就是join过程如果出现了已经在同一个集合中,那么此时再插入这条边,就会出现环// initres = []int{}father = make([]int, len(edges))for i, _ := range father{father[i] = i}for _, edge := range edges {join(edge[0], edge[1])}return res
}func find(u int) int {if u == father[u] {return u}r := find(father[u])father[u] = rreturn r
}func join(u ,v int ){ // 加入u->v 这条边fu := find(u-1)fv := find(v-1)if fu == fv {  // 已经在集合中res = []int{u, v}return}father[fu] = fv
}

冗余连接II

image

var father []int
func findRedundantDirectedConnection(edges [][]int) []int {// 需要针对两种大情况,三种小情况分别处理,两大分别是是否出现节点入度为2// 如果没有入度2节点,说明出现了环,并查集删除边即可// 如果出现入度2节点,1,两条边都可以删除,那么就删除后出现的边//                 2, 只有一条边能够保持删除后还是树,那就删除此边var nodeCount = make(map[int][][]int, len(edges))var node [][]int // 保存可能出现的入度2的两条边, 长度只能是0 或者 2father = make([]int, len(edges))for i ,_ := range edges{father[i] = i}// 判断是否有入度2的节点for _, edge := range edges {nodeCount[edge[1]] = append(nodeCount[edge[1]], edge)if len(nodeCount[edge[1]]) == 2{node = nodeCount[edge[1]]}}if len(node) == 0 { // 出现了环,没有入度为2的节点for _, edge := range edges {if same(edge[0], edge[1]) { // 出现了同时在集合中,这时这条要加入的边就是成环的边return edge}else {join(edge[0], edge[1])}}}else { // 出现入度为2节点// 判断一下删除之后是否还能够成树,node是顺序加入的两条边,所以遍历要倒叙,优先删除的是后面插入的边if checkTreeAfterRemove(edges, node[1]) {return node[1]}return node[0]}return []int{}
}func find(u int) int {if u == father[u] {return u}r := find(father[u])father[u] = find(father[u])return r
}func join(u, v int) {fu := find(u-1)fv := find(v-1)if fu == fv{return}father[fv] = fu
}func same(u,v int )bool {if find(u-1) == find(v-1){return true}return false
}func checkTreeAfterRemove(edges [][]int, remove []int)bool {// 思考一下原理,如果对于只能删除一条边的情况,错删除会导致出现一个单独节点,一个环,所以原理就是判断不加入这条边是否有环for _, edge := range edges {if edge[0] == remove[0] && edge[1] == remove[1] {continue}if same(edge[0], edge[1]) { // 出现了同时在集合中,这时这条要加入的边就是成环的边return false // 出现了环就是图,不是树了}else {join(edge[0], edge[1])}}return true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794445.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

D45XT120-ASEMI无人机专用D45XT120

D45XT120-ASEMI无人机专用D45XT120编辑:ll D45XT120-ASEMI无人机专用D45XT120 型号:26MT160 品牌:ASEMI 封装:DXT-5 批号:2024+ 现货:50000+ 最大重复峰值反向电压:1200V 最大正向平均整流电流(Vdss):45A 功率(Pd):大功率 芯片个数:5 引脚数量:5 安装方式:直插 类型…

golang中关于死锁的思考与学习

1、Golang中死锁的触发条件 1.1 书上关于死锁的四个必要条件的讲解 发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前,我们首先深入讨论一下死锁特点。 必要条件: 如果在一个系统中以下四个条件同时成立,…

ASP.NET 8 AOT 遍历文件夹获取文件名称及时长

朋友下了N多视频记不住文件夹下都有啥了…问批处理怎么导出文件夹下所有文件名及视频时长…批处理导出文件名好弄,获取视频时长真没用过…想到 .net 控制台程序 AOT 发布,不和批处理差不多效果…新建个控制台项目选下使用AOT 首先要获取文件的时长,我们需要用下 TagLibSharp…

公安网络信息体系能力分类

来源:中国电子科学研究院学报,《公安网络信息体系顶层设计》

轮胎充气压力 气压单位换算 All In One

轮胎充气压力 & 气压单位换算 All In One bar / psi 1 bar = 14.5 psi轮胎充气压力 & 气压单位换算 All In Onebar / psi气压单位换算 1 bar = 14.5 psi demos(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明这是一篇剽窃的文章,请访问 https://www.cnblog…

【工具推荐】xxl-jobExploitGUI - xxl-job一键漏洞利用工具+一键getshll

工具介绍 xxl-jobExploitGUI实现了XXL-JOB默认accessToken权限绕过漏洞的单个检测、批量检测、一键反弹shell功能,后续会持续更新优化,添加POC检测等。 下载链接: 链接: https://pan.quark.cn/s/55ed00b1512d使用说明 单个检测批量检测 fofa语句: body="{\"code\…

电动自行车轮胎规格参数图解教程 All In One

电动自行车轮胎规格参数图解教程 All In One电动自行车轮胎规格参数图解教程 All In One电动车轮胎参数单位换算1 in / 1 英寸 => 2.54 cm / 2.54 厘米https://convertlive.com/zh/u/转换/英寸/自/厘米#10 轮胎参数 轮胎尺寸(英寸): 轮毂尺寸(英寸): 10in 轮胎宽度/断面宽度…

首发找大佬定制的 黑神话悟空内置修改器

无敌模式 无伤判定 无限生命 无限法力 无限气力 无限棍势各种几十个功能 选择游戏进程直接起飞 自己打气死了一直过不去 直接找大佬定制一个 不想让兄弟们受气了 不限速链接:https://pan.quark.cn/s/f4f826c88f1d本文来自博客园,作者:Mr小扎仙森,转载请注明原文链接:http…

【工具推荐】TPscan (最新版本) - 一键ThinkPHP漏洞检测getshell

工具介绍 一键ThinkPHP漏洞检测,基于Python3,一键getshell 下载链接: 链接: https://pan.quark.cn/s/ff51139a5ace使用说明看着就真的看着,不学就真的5

强制删除PG数据库

删除数据是否显示: 有会话正在使用数据库: 解决: 一、查看谁在使用此数据库:SELECT * FROM pg_stat_activity WHERE usename = user where datname = your_database_name; 这将返回当前用户的所有活跃连接的详细信息。 二、如果可以最好先把占用的会话关掉后再删除 三、强…

训练框架技术序列一:Megtron-LLM架构源码

本文章涉及的Megatron-llm的XMind思维导图源文件和PDF文件,可在网盘下载: https://pan.baidu.com/s/1xRZD-IP95y7-4Fn0C_VJMg 提取码: qxff一、引言 Megatron-Core 是一个基于 PyTorch 的开源库,专为在 NVIDIA GPU 上高效训练大型语言模型(LLMs)而设计。它提供了一系列 GP…

KernelWarehouse:英特尔开源轻量级涨点神器,动态卷积核突破100+ | ICML 2024

动态卷积学习n个静态卷积核的线性混合,加权使用它们输入相关的注意力,表现出比普通卷积更优越的性能。然而,它将卷积参数的数量增加了n倍,因此并不是参数高效的。这导致不能探索n>100的设置(比典型设置n<10大一个数量级),推动动态卷积性能边界提升的同时享受参数的…