CF1389G

第一道自己想出的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的最近的点是相同的,答案也是相同的。
所以对于每个点换根即可。

posted @ 2020-09-13 18:26  celerity1  阅读(193)  评论(0编辑  收藏  举报