题目

从 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 生成树问题的更多相关文章

  1. hihoCoder offer 收割编程练习赛 83 C 播放列表

    题目 用 $1,2 ,3 \dots, N$ 代表 $N$ 首歌.设想有 $L$ 个格子排成一排,编号 $1$ 到 $L$ .考虑将这些数字挨个填进格子里的情形.假设当前要往第 $i$ 个格子里填一个 ...

  2. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  3. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  4. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  5. hihocoder offer收割编程练习赛8 C 数组分拆

    思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...

  6. hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

    题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...

  7. hihoCoder [Offer收割]编程练习赛3 D子矩阵求和

    子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...

  8. hihocoder [Offer收割]编程练习赛52 D 部门聚会

    看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...

  9. hihocoder [Offer收割]编程练习赛14

    A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...

随机推荐

  1. 3218: 字符串字符统计—C语言

    3218: 字符串字符统计—C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 270  解决: 129[提交][状态][讨论版][命题人:smallgyy] 题目描述 编写一函数,由实 ...

  2. 解决Jquery中使用each循环时,循环外的js依旧会执行

    今天在改项目bug时,发现一个问题,我获取一个div中所有的input,并取值时,判断某一条件,但是循环外的js依然可以执行. $(".tab-reg-next input").e ...

  3. React后台管理系统-商品管理列表组件

    1.商品列表页面结构 <div id="page-wrapper">              <PageTitle title="商品列表" ...

  4. package.json字段分析

    分析1.必须在包的顶层目录下2.二进制文件应该在bin目录下3.javascipt在lib目录下4.文档在doc目录下 package.json字段分析 name:包的名称,必须是唯一的,由小写英文字 ...

  5. 题解 P3367 【【模板】并查集】

    #include<iostream> #include<cstdio> using namespace std; int n,m,x,y,z; ]; //f[i]表示i的祖先 ...

  6. pycharm在同目录下import,pycharm会提示错误,但是可以运行

    原因是:    pycharm不会将当前文件目录自动加入自己的sourse_path. 解决方案:右键make_directory as-->sources path将当前工作的文件夹加入sou ...

  7. VM内存溢出

    平常开发时,有的人会运行的同时,会改代码,可能会导致VM内存溢出 Eclipse需要设置如下步骤: 1.点击Run>Run Configurations.. 2.定位到Tomcat(自己本地配置 ...

  8. 如何在 Linux 中配置基于密钥认证的 SSH

    什么是基于 SSH 密钥的认证? 众所周知,Secure Shell,又称 SSH,是允许你通过无安全网络(例如 Internet)和远程系统之间安全访问/通信的加密网络协议.无论何时使用 SSH 在 ...

  9. thinkphp 3.2.3 - Think.class.php 解析

    class Think { public static function start() { // 注册AUTOLOAD方法 spl_autoload_register('Think\Think::a ...

  10. [Python]有关pygame库中的flip和update的区别

    pygame.display.flip()和pygame.display.update()的用法上的区别: 资料一.   资料二. (资料最后更新时间:2019年1月9日)