【RQNOJ】【图论】发明测试数据

来源:互联网 发布:饼干的网络意思 编辑:程序博客网 时间:2024/04/30 04:36

 

题目描述

题目背景
出题目是一件很费力的事,为一道题出数据则是更加令人痛苦的事情。Wish 现在正在帮一些学弟学妹们出一些信息学竞赛的基础题,但在出数据的过程中遇到了一些棘手的问题……

Wish 出的题目是:找出给定带权图图的最小生成树,为了加大一点难度,给定的图均为无向完全图(即任意两个点均连一条边),并且 Wish 希望这个图中各边的权值尽可能大。

Wish 制作测试数据的方法比较特别,他是先生成一个树,然后再向这个树中加边来构造完全图。但是他发现他的程序有些问题,有的时候最后生成的图的最小生成树并不是开始给定的那个。

由于已经生成了很多组数据,为了检测出哪些数据有问题,他想让你计算出给定的树可构造出的完全图的最小边权值和是多少,于是生成的小于这个和的图的数据就可以筛去了。

题目描述
给定一个树 T,找出一个无向完全图 G,使得 T 是 G 的最小生成树,并且 G 各边的权值之和尽可能小,输出这个最小权值和即可。

输入格式

每个测试点包含多组数据,第一行一个数 t,表示共 t 组测试数据。
后接 t 组测试数据。
每组数据之前有一个空行。
每组数据的第一行有一个数 n,表示给定树的节点数(节点编号 1-n)。
之后 n-1 行,每行三个数 ai、bi、wi,表示节点 ai 和 bi 之间连有一条边,其权值为 wi。

数据范围
1 <= t <= 20
1 <= n <= 15000
1 <= ai, bi <= n
1 <= wi <= 10000

输出格式

对于每组测试数据,输出一行,表示求出的最小权值和。

样例输入

样例输出

三维状态图像


首先,定义一些符号:输入中给出的树记作T。我们要寻找的图记作G。如果u和v是G(同时也是T)中的节点,u和v在G(可能是T)中的边记作uv。在T中u和v间的路径记作uTv(这个路径总存在,而且是唯一的,因为T是一棵树)。图G是看起来是怎样的呢?考虑任意两个点a,b,他俩的边ab不在T中。由于G是一个完全图,ab这条边一定在G中。这条边的权值应该是多少?考虑路径aTb中的一些边(我们叫它cd)。如果ab的权不比cd的权大,那么我们可以通过删掉cd添入ab得到一棵新的生成树T0。无疑,T0是图G的一棵权和不比T大的生成树。但是这与T是G的唯一最小生成树相矛盾。
这一切都意味着图G有以下必要条件:不在树T中的每条边ab的权值都应当严格大于路径aTb中每条边的权值。
一个问题就来了:这个条件是否是充分的?答案是肯定的。为了说明这一点,我们考虑图G中一个异于T的一棵生成树U。由于U异于T,它包含一条不在T中的边(ab)。我们从U中去掉边ab得到了两个连通分量(一个包含点a,另一个包含点b)。显然路径aTb必包含一条能把这俩连通分量连接起来的边(cd)。(否则它无法连接a和b)通过加入cd连接连通分量得到一棵新的生成树U0。但是U0的权和小于U的权和,因为ab的权值大于cd的权值。这意味着U不是G的最小生成树。
现在,方法就很清楚了。对于任意边ab不在路径aTb中的点对a和b,我们给ab确定一个满足上述条件的权值。这可以在O(N*N)的时间内完成(N是T的节点数)。其实仿照Kruskal最小生成树算法我们可以得到一个更快的方法。我们把输入的
边按照权值排序。每次添加一条权值为w的边,把两个连通分量合成一个。此时,我们给其他能连接这两个连通分量的点对牵一条权值为w+1的边,这样得到的结果显然与N*N算法的结果相同,但是只需要O(NlogN)的时间。

(来源:http://xujieqi.blog.hexun.com/22087606_d.html)

原创粉丝点击