第一道自己想出的2800。
首先,把所有边双联通分量缩成一个点。
为什么?可以用dfs树证明。
从根节点开始dfs。
dfs生成树上父亲到儿子定向,返祖边的定向为儿子到祖先。
根据边双联通分量的性质,每条边必定被一条反向边覆盖。
这说明每条边至少被一个环覆盖。
如果我们在这个边双内插入无向边,结果不会更好。
缩点后原图变成了树。问题得到了简化。
考虑对于每个点x,把它定为根。
求出所有特殊点的链并,找到链并上距离x最近的点y。
再把y定为根。
则x的没有链并点的子树都可以被选。
但是这样子可能不优秀。
会发现这么一个性质:我们选定的连无向边的点肯定是包含y的一个连通块
如果有一个连通块不和y连通,则这个连通块->y的边一定是从儿子到父亲的。这个连通块不能和其他关键点连通。
可以使用一个简单的dp解决。
设(f_x)表示包含(x)点的连通块最大价值。
枚举每个(x)点的儿子(y)。
如果(x,y)之间的边的权值为(w)
则当(w<=f_y),(f_x+=f_y-w)
题目要我们求每个点的答案,这样子时间复杂度太高。
注意到对于两个点a,b,链并上如果距离a,b的最近的点是相同的,答案也是相同的。
所以对于每个点换根即可。