类似于图论的次小生成树。现场赛过程中,在 WH 的提示下,Wideas 敲的这题。赛后 WH 回忆到,比赛时他想起暑假的时候郭炜说:“你们一定要懂次小生成树啊!”结果就想出了这题……

首先生成图的最小生成树,然后,枚举任意两点 u, v: 如果边 (u, v) 就在最小生成树里,那么就算一下把 (u, v) 当成 magic road 时,[人口 / 其余路径长度]的值(即 A / B 的值);如果边 (u, v) 不在最小生成树里,那么此时如果连接 u 和 v, 就会形成一个环,在环上找到除 (u, v) 外最大的一条边,删除之,再以 (u, v) 为 magic road, 计算 A / B 的值。记录下每次计算出来的值中的最大值,输出之。

我是用 Prim 写的最小生成树,因为这题是一个完全图,边数有点多。然后,我使用了一个二维数组来记录,最小生成树中,路径 u → v 上最长的边有多长。方法是每添加一个新顶点的时候,就判断所有已经添加到最小生成树中的顶点,到新添加的顶点的路径上最长的边的长度。具体内容在我的源代码的 82 到 89 行中。

源代码如下:

原创文章,转载请注明来源:http://euyuil.com/3199/acm-icpc-2011-beijing-qin-shi-huangs-national-road-system/