P3177 [HAOI2015] 树上染色

news/2024/7/15 17:40:31 标签: 算法, 图论, 动态规划, 数据结构, c++

P3177 [HAOI2015] 树上染色

[P3177 HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

文章目录

  • P3177 [HAOI2015] 树上染色
    • 题目大意
    • 思路
    • code

题目大意

有一棵 n n n 个点的树,你可以在上面把 k k k 个点染成黑色,收益为黑点两两之间的距离和加上白点两两之间的距离和

求最大收益。

思路

树上背包

这种题肯定找边的贡献

f u , i f_{u , i} fu,i 为以 u u u 为根的子树内染了 i i i 个黑点的最大收益

s z u sz_u szu 为以 u u u 为根的子树的节点个数

一条连接 u , v u , v u,v 的边, v v v 子树上有 j j j 个黑点,那么这条边的贡献为:
v a l = j ∗ ( k − j ) ∗ e [ i ] . w + ( s z v − j ) ∗ ( n − k − s z v + j ) ∗ e [ i ] . w val = j * (k - j) * e[i].w + (sz_v - j) * (n - k - sz_v + j) * e[i].w val=j(kj)e[i].w+(szvj)(nkszv+j)e[i].w

显然:
f u , i = max ⁡ v ∈ s o n ( u ) f v , j + f u , i − j + v a l ( 0 ≤ j ≤ i ≤ k ) f_{u , i} = \max_{v \in son(u)} f_{v , j} +f_{u , i - j} + val (0\le j\le i \le k ) fu,i=vson(u)maxfv,j+fu,ij+val(0jik)
实现时要倒序枚举 i i i 防止重复选, j = 0 j = 0 j=0 的情况要提前转移一下

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
#define LL long long
using namespace std;
const int N = 2005;
int n , hd[N] , cnt , fa[N] , sz[N] , K;
LL f[N][N];
struct E {
    int to , nt;
    LL w;
} e[N << 1];
void add (int x , int y , LL z) { e[++cnt].to = y , e[cnt].nt = hd[x] , hd[x] = cnt , e[cnt].w = z; }
void dfs (int x) {
    int y;
    sz[x] = 1;
    f[x][0] = f[x][1] = 0;
    for (int i = hd[x] ; i ; i = e[i].nt) {
        y = e[i].to;
        if (y == fa[x]) continue;
        fa[y] = x;
        dfs (y);
        sz[x] += sz[y];
        fd (j , min (K , sz[x]) , 0) {
            if (f[x][j] != -1)
                f[x][j] += f[y][0] + (n - K - sz[y]) * sz[y] * e[i].w;
            fu (k , max(1 , j + sz[y] - sz[x]) , min (j , sz[y])) {
                if (f[x][j - k] == -1) continue;
                f[x][j] = max (f[x][j] , f[x][j - k] + f[y][k] + e[i].w * (K - k) * k + e[i].w * (n - K - sz[y] + k) * (sz[y] - k)); 
            } 
        }
    }
}
int main () {
    int u , v;
    LL w;
    scanf ("%d%d" , &n , &K);
    fu (i , 1 , n - 1) {
        scanf ("%d%d%lld" , &u , &v , &w);
        add (u , v , w) , add (v , u , w); 
    }
    memset (f , -1 , sizeof (f));
    dfs (1);
    printf ("%lld" , f[1][K]);
    return 0;
}

http://www.niftyadmin.cn/n/5091947.html

相关文章

LiveMedia视频中间件支持GB35114的设备接入

LiveMedia视频平台经过一年的研发和沉淀&#xff0c;已逐步完善了从前端多协议&#xff08;海康、大华、GB28181、RTSP、ONVIF等&#xff09;设备接入、视频&#xff08;软硬兼容&#xff09;转码、视频转发、平台级联等一系列功能并提供完善的API调用接口&#xff0c;目前已在…

【蓝桥】契合匹配

一、题目 1、题目描述 小蓝有很多齿轮&#xff0c;每个齿轮的凸起和凹陷分别用一个字符表示&#xff0c;一个字符串表示一个齿轮。 如果这两个齿轮的对应位分别是同一个字母的大小写&#xff0c;我们称这个两个齿轮是契合的。 例如&#xff1a;AbCDeFgh 和 aBcdEfGH 就是契合…

基于PHP实现微信客服欢迎语发送

背景:用户通过某客服链接进入客服会话页面,客服进行欢迎语的发送 技术栈:larvelredis 本文章仅提供思路参考&#xff0c;详情查看官方文档 实现思路如下: 验证url: 实现微信客服正常使用首先需要在企微后台进行配置,如果要实现Api进行欢迎语发送时&#xff0c;就需要回调接…

2.Python-用Flask框架创建一个简单的Web程序

怎么安装Flask框架 在终端输入以下命令&#xff1a; pip install flask 验证flask安装&#xff1a; flask --version 编写app.py文件 app文件py如下&#xff1a; #导入flask框架中的两个模块 #Flask允许创建一个Flask应用实例&#xff0c;处理路由、请求和响应等功能 #render…

JDK1.8对HashMap的优化、以及通过源码解析1,8扩容机制

JDK 1.8 对 HashMap 进行了一些优化&#xff0c;主要包括以下几个方面的改进&#xff1a; 红黑树&#xff1a;在 JDK 1.8 中&#xff0c;当哈希碰撞&#xff08;多个键映射到同一个桶&#xff09;达到一定程度时&#xff0c;HashMap 会将链表转化为红黑树&#xff0c;以提高查找…

基于springboot实现心灵治愈心理健康平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现心灵心理健康平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…

Spring 事务的简单了解

目录 设计实现 工作原理 简单示例 隔离级别 事务传播机制 Spring框架提供了强大的事务管理支持&#xff0c;它允许开发者以声明性或编程性的方式来管理事务&#xff0c;从而保证数据的一致性和完整性。Spring事务管理的主要特点包括&#xff1a; 声明式事务管理&#xff1…

5、docker mysql安装

1、查看版本 docker search mysql 2、下载镜像到本地 下载镜像&#xff0c;本文以5.7为例 docker pull mysql:5.7 3、创建挂载目录 mkdir /usr/local/mysql 4、创建mysql容器 docker run --name mysql-test -e MYSQL_ROOT_PASSWORDroot -p 3306:3306 -d mysql –name&am…