首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图论算法

图论算法
EN

Stack Overflow用户
提问于 2016-03-09 03:11:03
回答 1查看 150关注 0票数 0

给定的问题是

给定一个有n个顶点的森林,添加边使其成为直径最小的树。我尝试了许多方法,但都没有通过系统测试,cases.Please建议了一些算法来解决这个问题。

这是社论ncpc.idi.ntnu.no/ncpc2015/ncpc2015slides.pdf的链接,问题的名称是“毗邻网络”。我不能理解社论中提供的解决方案。

更新:

https://www.quora.com/What-is-the-solution-for-Dreaming-on-IOI-2013

此链接为社论中提到的解决方案提供了最佳解释

EN

回答 1

Stack Overflow用户

发布于 2016-03-09 03:24:31

表示为ecc(v)的顶点v的偏心率被定义为ecc(v):=max_u d(u,v),即到图中最远顶点的距离。图G的中心是对其具有ecc(v)=min_v max_u d(u,v)的任何顶点v,即中心是最小化偏心率的顶点。

如果您合并两个树(来自不同的连接组件),T1T2,通过在它们的中心c1c2之间放置一条边,您将得到一个带有diam T = max(diam T1, diam T2, 1+rad(T1)+rad(T2))的树T

从这些属性可以明显看出下面方法的正确性。

这里有一个算法的想法,不是我想出来的:

通过以智能的方式在中心之间放置边,让

  • T1T2,...,Tk成为构成每个树组件的forest.

当然,现在的问题是如何巧妙地解决最后一颗子弹。直观地说,我建议您首先连接直径最大的树(然后更新新树的直径并计算新树的中心)。可能是这样的:

while优先级队列包含多个树do

  • T1T2是直径最大的树;让c1c2作为它们的c1c2,以形成一棵新的树和<
  • d44的新中心堆,计算diam T并将T放回优先级队列(可以是以直径为键的最大堆)。

done

更新。我不确定是先加入直径最大的树,还是反过来加入(即先加入直径最小的树)。但现在很容易做一个证明的草图(一旦你弄清楚该走哪条路),证明这是正确的方式。

如果你首先连接最大的(如中所建议的),那么这个数学运算肯定会通过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35875976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档