zoukankan      html  css  js  c++  java
  • 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的最近的点是相同的,答案也是相同的。
    所以对于每个点换根即可。

  • 相关阅读:
    搭建Flask+Vue及配置Vue 基础路由
    vue dev 环境下的跨域访问
    vue 调用常量的config.js文件
    PyCharm 通过Github和Git上管理代码
    MongoDB 配置服务
    2018年11月12日
    搭建 flask 应用
    Python 错误总结
    搭建 Django 平台
    go实现主线程等待子线程都运行完再退出
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/13662377.html
Copyright © 2011-2022 走看看