首页 > 其他分享 >次小生成树

次小生成树

时间:2023-08-29 23:47:50浏览次数:34  
标签:log 树边 tt 最小 生成 非树边

前言

记录一下,顺便捋一捋思路。

前置知识

  • 最小生成树 \(\tt{Kruskal}\)
  • 树上倍增
  • \(\tt{LCA}\)

非严格次小生成树

有一种贪心的做法,我们先得出该无向图的最小生成树,最小生成树上的边称为树边,反之为非树边。先可以得到一个定理,次小生成树与最小生成树一定只有一条边不同,也就是次小生成树中含有一条非树边代替了一条树边。

可以用反证法证明,若存在多于一条边不同,那么此时的生成树没有只存在一条边不同的生成树更优,原因显然。

因此我们可以先求出最小生成树,再考虑用非树边替换树边。

而现在的问题在于如何保证替换后所得到的是一个树形结构。可以发现,我们要替换的这条非树边的两个节点一定与最小生成树中这两个节点的路径构成环。那么我们可以删除该环中任意一条边,所得到的一定是树形结构。考虑删去掉哪条边,很明显删去边权最大的一条边。这样才可以最小化该边与非树边的差值。

那么我们就只要枚举每条非树边,并用非树边的两个节点在生成树中构成的路径的最大边来替换即可。而路径的求法就是先求出两个节点的最近公共祖先,然后再向上跳。

\(\tt{Kruskal}\) 求最小生成树是 \(\Theta(m \log m)\),最大值可以用树上倍增来维护,与 \(\tt{LCA}\) 一样,均用倍增维护,时间复杂度 \(\Theta(n \log n)\),所以总时间复杂度是 \(\Theta(m \log m+n \log n)\).

严格次小生成树

注意到严格,也就是说不能存在等于的情况。那么以非严格次小生成树的求法为基础,我们只需要再维护一个次大值即可。

当我们要替换的树边与非树边权值相等时,我们就用次大的树边来替换。

时间复杂度同上。

题目

P4180

评价

用处不大,不该看做一个板子,调试很费劲,代码调的比较乱,就不放了。

标签:log,树边,tt,最小,生成,非树边
From: https://www.cnblogs.com/Scorilon/p/17666129.html

相关文章

  • 生成式 AI 在泛娱乐行业的应用场景实践 – 助力风格化视频内容创作
    感谢大家阅读《生成式AI行业解决方案指南》系列博客,全系列分为4篇,将为大家系统地介绍生成式AI解决方案指南及其在电商、游戏、泛娱乐行业中的典型场景及应用实践。目录如下:《生成式AI行业解决方案指南与部署指南》《生成式AI在电商行业的应用场景实践–赋能营销物......
  • 智能正则表达式生成: Regex.ai助您编写更便捷的匹配规则
    正则表达式是一种强大的文本匹配工具,然而,对于许多人来说,学习和编写正则表达式却是一项相对复杂的任务。为了让正则表达式编写更加智能化和高效,Regex.ai应运而生。本文将深入介绍Regex.ai的作用以及其在正则表达式编写领域的价值。1.Regex.ai服务简介Regex.ai是一款基于人工智能......
  • 生成器
    概念Python生成器是一种特殊的函数,它可以在需要时生成一个序列的值。与普通函数不同,生成器函数使用yield语句或生成器表达式(也叫生成器推导式)来产生值,并且可以暂停和恢复执行。生成器可以逐个生成值,而不是一次性生成整个序列,这样可以节省内存并提高性能。一般与循环语句(for、whi......
  • 使用 ONLYOFFICE 宏生成和插入词义
    要让写的内容更清楚,建议在文章中添加一些词义。使用ONLYOFFICE宏,这个可以来自动实现,无需浪费时间了。阅读本文,了解如何创建一个宏,从外部API中提取单词定义并将其无缝插入到文档中。什么是ONLYOFFICE宏如果您是一名资深MicrosoftExcel用户,那么相信您已对于VBA宏非常熟悉......
  • 使用 ONLYOFFICE 宏生成和插入词义
    要让写的内容更清楚,建议在文章中添加一些词义。使用ONLYOFFICE宏,这个可以来自动实现,无需浪费时间了。阅读本文,了解如何创建一个宏,从外部API中提取单词定义并将其无缝插入到文档中。什么是ONLYOFFICE宏如果您是一名资深MicrosoftExcel用户,那么相信您已对于VBA宏非常熟悉......
  • Mybatis - useGeneratedKeys 和 keyProperty,获取插入主键自动生成的 Id
    <insertid="insertOrder"parameterType="com.buchstadt.params.PayForData"useGeneratedKeys="true"keyProperty="id">INSERTINTOorders(user_id,total,location,holder_phone,holder_name)VALUES......
  • visual studio 生成dll文件以及修改输出dll文件名称操作
    visualstudio生成dll文件以及修改dll文件名称Windows系统下VisualStudio可以通过.def文件创建dll。一、准备测试代码1.确定需要导出的函数,test.cpp文件中定义如下voidfun1(){ return;}voidfun2(){ return;}intmain(){ return0;}2.添加.def文件,一般添加到源文件下面。......
  • js面向对象浅析-表单生成
    js面向对象浅析-表单生成前言:这里就表单生成器的案例对js面向对象分析一下。。。(function(window){varFormBuilder=function(data){this.data=data;};window.FormBuilder=FormBuilder;})(window);FormBuilder.prototype.create=function(){va......
  • DataGrip自动生成实体
    选择一个表,弹出右键菜单  ,在弹出菜单选择 工具->脚本化扩展程序 ->转到目录 在目录里新建一个groovy文件,比如abc.groovy  在文件里注入以下内容后,  就可生成实体类.  生成方法: 选择一个表,弹出右键菜单  ,在弹出菜单选择 工具->脚本化扩展程序......
  • Python中什么时候会用到生成器?
    示例:我:帮我写一个Python的生成器的示例:AI:当然可以!以下是一个简单的示例,生成器函数用于生成一个范围内的偶数:defeven_numbers(start,end):  current=start  whilecurrent<=end:    ifcurrent%2==0:      yieldcurrent    ......