给定的问题是
给定一个有n个顶点的森林,添加边使其成为直径最小的树。我尝试了许多方法,但都没有通过系统测试,cases.Please建议了一些算法来解决这个问题。
这是社论ncpc.idi.ntnu.no/ncpc2015/ncpc2015slides.pdf的链接,问题的名称是“毗邻网络”。我不能理解社论中提供的解决方案。
更新:
https://www.quora.com/What-is-the-solution-for-Dreaming-on-IOI-2013
此链接为社论中提到的解决方案提供了最佳解释
发布于 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
,即中心是最小化偏心率的顶点。
如果您合并两个树(来自不同的连接组件),T1
和T2
,通过在它们的中心c1
和c2
之间放置一条边,您将得到一个带有diam T = max(diam T1, diam T2, 1+rad(T1)+rad(T2))
的树T
。
从这些属性可以明显看出下面方法的正确性。
这里有一个算法的想法,不是我想出来的:
通过以智能的方式在中心之间放置边,让
T1
,T2
,...,Tk
成为构成每个树组件的forest.
ci
的树。当然,现在的问题是如何巧妙地解决最后一颗子弹。直观地说,我建议您首先连接直径最大的树(然后更新新树的直径并计算新树的中心)。可能是这样的:
while优先级队列包含多个树do
T1
和T2
是直径最大的树;让c1
和c2
作为它们的c1
和c2
,以形成一棵新的树和<diam T
并将T
放回优先级队列(可以是以直径为键的最大堆)。done
更新。我不确定是先加入直径最大的树,还是反过来加入(即先加入直径最小的树)。但现在很容易做一个证明的草图(一旦你弄清楚该走哪条路),证明这是正确的方式。
如果你首先连接最大的(如中所建议的),那么这个数学运算肯定会通过。
https://stackoverflow.com/questions/35875976
复制相似问题