题目链接:https://cn.vjudge.net/problem/UVA-1664
题意:n个城市形成一棵树,每条边有权值C(i, j)。任意两个点的容量S(i, j)定义为i与j唯一通路容量上的最小值。找一个点(他将成为中心城市),使得它到其他所有点的容量之和最大。
思路:很巧妙地并查集维护问题。首先把所有边按照权值从大到小排序,这样可以确保我们每次选出的边都比已选出的小。接下来按照Kruskal的思路来,假设我们已经维护好了一些集合(点的集合),其中每个集合中某个点到集合中所有点容量和的最大值为sum[i],集合点的数量为cnt[i]。对于下一条被选出的边(u,v,c),设u属于集合X,v属于集合Y,如果我们选择X中的点作为中心城市,则答案为sum[X] + cnt[Y] * c(因为这条边比已经出现的边权值都要小,所以两个集合间必以这条路作为容量),同理,若选Y中点作为中心城市,则答案为sum[Y] + cnt[X] * c,我们取两者中的最大值,将较小值的集合合并到较大值的集合。一步步下去,最终集合的sum值就是答案。