题目大意:
有一棵树,每条边有权值,从树上一点到另一点的路径权值为该条路径上的最小权边,选一个点使得该点到其余所有点的路径权值和最大.
题目思路:
看一下规模,可能是贪心,dp,线段树之类的,线段树明显没想法,dp嘛,状态太多了,那就想想贪心,不过不管是什么方法,最终的目的就是要得到一个有根树,这里我们可以用并查集+路径压缩来做.
贪心我们只要考虑构树是按边的权值降序还是升序,如果选用升序的话,当前边要到前面加入的边的限制,所以就麻烦了,而降序呢,前面加入的边是受当前边的限制,所以相对容易多了.
对与每个父亲还要保存到其子孙的路径权值和以及子孙数量,这在合并两棵树是要用到.
1)两个点均无父亲,任选一个作为父亲.
2)其中一个无父亲,把有父亲的父亲作为无父亲的父亲(很绕口= =...将就一下).
3)均有父亲,那么就要判断一下到底谁做父亲可以使构成的树路径权值更大,在这边就要用到路径权值和以及子孙数量了(我是用到了,大牛可能不需要...).
代码:
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include