题目

从 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)$ 。

最新文章

  1. easyUI的基础布局
  2. WebClient 实现多文件/文本同时上传
  3. CSS3图片倒影技术实现及原理
  4. [IPA]IOS In App Purchase(内购)验证
  5. P3398 仓鼠找sugar
  6. Android里面的命名规范
  7. centos emacs安装
  8. eclipse项目显示标尺
  9. ORACLE11G常用函数
  10. linux学习笔记之文件类型,及目录介绍
  11. Python模块学习:threading 多线程控制和处理
  12. tomcat server.xml context path配置需要注意的事情
  13. 常见的磁盘I/O和网络I/O优化技巧
  14. redis 基本原理及安装
  15. Linux comm命令求出文件的交集、差集
  16. 重构——一个小例子
  17. js - 伪数组转化为数组的几种方法整理(更新中...)
  18. [20170627]使用TSPITR恢复表空间.txt
  19. Codeforces 235E. Number Challenge DP
  20. Dubbo整合SpringBoot

热门文章

  1. selective search生成.mat文件
  2. python_输入一个数,判断是否是素数
  3. Ubuntu下安装pip3和Python的第三方库
  4. MySQL优化器功能开关optimizer_switch
  5. java算法面试题:编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
  6. C++大数问题
  7. JAVA JDBC 连接 Oracle
  8. 爬虫 xpath etree自动补全页面
  9. 第二章JavaScript 函数和对象
  10. tcl之变量-数组array