hihoCoder [Offer收割]编程练习赛83 D 生成树问题
从 Kruskal 算法的角度来思考这个问题。
考虑 $n$ 个点的“空图”(即没有边的图)。
先将 $m_2$ 条无权值的边加到图中,得到一个森林。
按边权从小到大的顺序枚举 $m_1$ 条有权值的边。
对于边 $e\colon(u, v, w)$,若将 $e$ 加入图中之后
(i) 会形成环,这意味着 $u$ 到 $v$ 的路径上的所有边的权值都不大于 $w$;
(ii) 不会形成环,则将其加入图中。
我们需要解决的问题:$m_2$ 条原本无权值的边在形如“$u$ 到 $v$ 的路径上的所有边的权值都不大于 $w$”的约束之下,每条边的最大权值是多少。
可以用树链剖分来帮助计算。
复杂度 $O(n\log^2n)$
正确性
首先,容易证明上述算法为每条原本无权值的边所确定的权值能够使得这些边出现在某个最小生成树中(充分性)。
其次,假设上述算法为某条原本无权值的边 $(u,v)$ 所确定的权值为 $w$,若将边 $(u,v)$ 的权值改为 $w+1$,则这条边必然不存在于任意一棵生成树中(必要性)
猜想
其实对 $m_1$ 条边按权值排序是不必要的,按什么顺序枚举这 $m_1$ 条边对结果并无影响。
这猜想是错的。
反列
Implementation
https://gist.github.com/GoBigorGoHome/6787ee01dbf1a2ba411d8baeea75e4a2
(以下内容有误)
另一种解法
我们不必把最小生成树真实的形态存下来。
按照上面的分析,我们只要知道在我们构造的那棵最小生成树中任意两点间的路径上有哪些边就可以了。
形式化地说,考虑两棵树 $T$,$T'$,它们的边集分别为 $E$,$E'$,我们要构造一个 $E$ 到 $E'$ 的双射,使得在这两棵树中,任意两点 $u,v$ 之间的路径的边集都相等,即 $\forall u, v$,$E(u,v) = E'(u,v)$
我们发现在 Kruskal 算法中,并查集合并子树时,如果按秩合并且不采用路径压缩,那么最后得到的树就符合上述要求。
以上图为例,将设我们要往图中加入边 $(u,v)$,那么我们可以把边 $(4,5)$ 当作边 $(u,v)$,可以证明在并查集对应的树中点 $a$ 到点 $b$ 需要经过边 $(4,5)$ 当且仅当在原生成树中从点 $a$ 到点 $b$ 需要经过边 $(u,v)$ 。
hihoCoder [Offer收割]编程练习赛83 D 生成树问题的更多相关文章
- hihoCoder offer 收割编程练习赛 83 C 播放列表
题目 用 $1,2 ,3 \dots, N$ 代表 $N$ 首歌.设想有 $L$ 个格子排成一排,编号 $1$ 到 $L$ .考虑将这些数字挨个填进格子里的情形.假设当前要往第 $i$ 个格子里填一个 ...
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- hihocoder offer收割编程练习赛8 C 数组分拆
思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...
- hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)
题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...
- hihoCoder [Offer收割]编程练习赛3 D子矩阵求和
子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...
- hihocoder [Offer收割]编程练习赛52 D 部门聚会
看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...
- hihocoder [Offer收割]编程练习赛14
A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...
随机推荐
- Jmeter命令行参数
一.在linux中,使用非gui的方式执行jmeter.若需更改参数,必须先编辑jmx文件,找到对应的变量进行修改,比较麻烦.因此,可以参数化一些常用的变量,直接在Jmeter命令行进行设置 二.参数 ...
- vue 自定义动态弹框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Oracle10g安装过程中的Configuration Assistant配置失败的问题。
前几天安装Oracle的时候碰到了一个小问题,是在最后配置的时候,出现失败提示如下 失败提示:一些 Configuration Assistant 失败.强烈建议您此时重试这些 Configurati ...
- Java - 若try中有return语句,finally会执行吗?在return之前还是之后呢?
会执行,在方法return动作之前,return语句执行之后,若finally中再有return语句,则此方法以finally的return作为最终返回,若finally中无return语句,则此方法 ...
- 在windows上搭建镜像yum站的方法
在windows上搭建镜像yum站的方法(附bat脚本) 分类: 运维基本功,其他 方法一:支持rsync的网站 对于常用的centos.Ubuntu.等使用官方yum源在 http://mi ...
- 三、Linux 系统目录结构
Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最 ...
- 小程序wafer2操作数据库
小程序操作数据库 //小程序控制台phpmyadmin里给数据库cAuth添加表 //controllers/hello.js const { mysql } = require('../qcloud ...
- 科学计算库Numpy——文件读写
读文件 要读取的文件 有分隔符的文件 备注:delimiter分隔符. 有多余行的文件 备注:skiprows去掉几行. 指定列 备注:usecols指定使用哪几列. 写文件 保存后的文件 备注:fm ...
- pip3 的安装 同时安装lxml和pygame
ubuntu18.04中 首先查看自己电脑的python版本,一般都会有2, 和3 python -V python3 -V 查看pip版本 pip -V pip3 -V 现在我们就可以开始安装我们的 ...
- AndroidStudio和IDEA的初始设置
一.第一次安装: Android Studio安装完成后,第一次启动AS前,为了避免重新下载新版本的SDK,需要做如下操作: AS启动前,打开安装目录,请先将bin目录的idea.properties ...