修建道路使得n个点任意两点之间都可以连通,每个点有都有一定的人口,现在可以免费修一条道路,
A是免费修的道路两端结点的人口之和, B的其它不是免费修道路的长度的总和
要求的是A/B的最短值。
B其实就是最小生成树删除一条边只有的权值之和B。 只要我们知道生成树上任意两点之间的最长边,那么只要在这两点之间修一条边,
然后删除最长边,它还是一棵树。 而已这时候的权值之和是B-maxCost[u][v]
那么 答案就是min{p[u][v] / (B-maxCost[u][v])} , 枚举u,v的时间复杂度是O(n*n)。
至于得到maxCost[u][v] 只要在得到最小生成树之后,一遍dfs就可以求出
求解的方法是:当访问一个新节点时,计算所有已经访问过的结点到这个结点的最小权值
max[u][x] = maxCost[x][u] = max(maxCost[x][fa],edge(u,fa))
u是当前访问的结点,fa是u的父亲, x是所有已经访问过的结点。
(其实就是两个嵌套的循环,只不过是在树上循环罢了)
总的时间复杂度是n*n + e*loge 常数没有计算进去。
n*n和eloge 最大时都是1000多w, 3s的时间,足够了
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include
View Code