博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hihoCoder [Offer收割]编程练习赛83 D 生成树问题
阅读量:5061 次
发布时间:2019-06-12

本文共 989 字,大约阅读时间需要 3 分钟。

从 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$ 条边对结果并无影响。

这猜想是错的。

反列

681660-20181126110113342-102920012.png

Implementation


以下内容有误

另一种解法

我们不必把最小生成树真实的形态存下来。

按照上面的分析,我们只要知道在我们构造的那棵最小生成树中任意两点间的路径上有哪些边就可以了。

形式化地说,考虑两棵树 $T$,$T'$,它们的边集分别为 $E$,$E'$,我们要构造一个 $E$ 到 $E'$ 的双射,使得在这两棵树中,任意两点 $u,v$ 之间的路径的边集都相等,即 $\forall u, v$,$E(u,v) = E'(u,v)$

我们发现在 Kruskal 算法中,并查集合并子树时,如果按秩合并且不采用路径压缩,那么最后得到的树就符合上述要求。

681660-20181127231230492-1410492672.png

以上图为例,将设我们要往图中加入边 $(u,v)$,那么我们可以把边 $(4,5)$ 当作边 $(u,v)$,可以证明在并查集对应的树中点 $a$ 到点 $b$ 需要经过边 $(4,5)$ 当且仅当在原生成树中从点 $a$ 到点 $b$ 需要经过边 $(u,v)$ 。

转载于:https://www.cnblogs.com/Patt/p/9981169.html

你可能感兴趣的文章
“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
查看>>
【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)
查看>>
在WPF中使用Caliburn.Micro搭建MEF插件化开发框架
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
UWP: 掌握编译型绑定 x:Bind
查看>>
asp.net core系列 35 EF保存数据(2) -- EF系列结束
查看>>
WPF程序加入3D模型
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
C#中的IEnumerable<T>知识点
查看>>
android访问链接时候报java.net.MalformedURLException: Protocol not found
查看>>
dwz ie10一直提示数据加载中
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Windows Phone Marketplace 发布软件全攻略
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
语义web基础知识学习
查看>>
hexo个人博客添加宠物/鼠标点击效果/博客管理
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
关于WPF的2000件事 02--WPF界面是如何渲染的?
查看>>
单元测试、、、
查看>>