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)暴力枚举发现把 ...
随机推荐
- 【BZOJ2049】[SDOI2008] Cave 洞穴勘测(LCT维护连通性)
点此看题面 大致题意: 有\(n\)个洞穴,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 这道题应该是\(LCT\)动态维护连通性的一道模板题. 考虑将\(x\) ...
- 【BZOJ1030】[JSOI2007] 文本生成器(AC自动机上跑DP)
点此看题面 大致题意: 给你\(N\)个字符串(只含大写字母),要你求出有多少个由\(M\)个大写字母构成的字符串含有这\(N\)个字符串中的至少一个. \(AC\)自动机 看到题目,应该比较容易想到 ...
- Rhadoop安装
1.ubuntu,hadoop,R,jdk安装好 2.下载Rhadoop项目的的三个包,rmr,hdfs,rHBase存放到Downloads/R. 3.切换到root 4.安装依赖的库 ~R CMD ...
- React后台管理系统-rich-editor组件
1.Simditor组件的github地址:https://github.com/mycolorway/simditor 网址:http://simditor.tower.im/ 2.在util里边新 ...
- jeesite项目
1,登录页面.最高权限管理员 用户名:thinkgem 密码:admin 2,登陆之后展示的首页 3,分为不同的模块,由不同的入负责,我负责日志管理 已完成功能:模糊查询,分页,导入,导出Excel ...
- mysql 查询条件 默认不区分大小写
mysql查询默认是不区分大小写的 如: 1 2 select * from some_table where str=‘abc'; select * from some_table where st ...
- 五、MySQL 创建数据库
MySQL 创建数据库 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 以下命令简单的演示了创建数据库的过程,数据名为 ...
- ARM协处理器
协处理器是一种芯片,用于减轻系统微处理器的特定处理任务.例如,数学协处理器可以控制数字处理:图形协处理器可以处理视频绘制.例如,intel pentium微处理器就包括内置的数学协处理器. 协处理器 ...
- centos7安装mongodb3.6
1. 安装一下centos(6.5) + 虚拟机,在VMware中安装mongodb 2. 下载mongodb最新版本:mongodb-linux-x86_64-3.6.4.tgz,传到centos ...
- Android Studio 安装与使用ADB wifi 无线调试
首先,安装ADB WIFI File->Settings->Plugins 其次,用USB连接手机与电脑(并开启手机的调试模式) 任务栏若无提示,即可拔下USB线,开始无线调试 任务栏若是 ...