BZOJ4033或洛谷3177 [HAOI2015]树上染色
BZOJ原题链接
洛谷原题链接
很明显的树形\(DP\)。
因为记录每个点的贡献很难,所以我们可以统计每条边的贡献。
对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有\(B_y\),白点有\(W_y\),边权为\(w\),那么这条边的贡献就是\((W_x\times W_y + B_x\times B_y)\times w\)。
然后设计\(DP\)状态,定义\(f[x][v]\),表示以\(x\)为根的子树里分配\(v\)个黑点的最大贡献。
初始化为\(-1\),在\(dfs\)到\(x\)点时,再初始化\(f[x][0] = f[x][1] = 0\)。
设\(y\)表示\(x\)的一个儿子, \(k\)为题目中所述。
于是有转移方程:
\(\qquad\qquad i = \min\{k, size[x]\} \longrightarrow 0\)
\(\qquad\qquad\quad j = 0\longrightarrow \min\{i, size[y]\}\)
\(\qquad\qquad\qquad f[x][i] = \max\{f[x][i], f[x][i - j] + f[y][j] + value\}\qquad if\quad f[x][i - j] \ne -1\)
\(i\)是在以\(x\)为根的子树中分配多少黑点,\(j\)是在以\(y\)为根的子树中分配多少黑点。
\(value\)是通过\(x\to y\)这条边所新增的贡献,即\(value = (j \times (k - j) + (size[y] - j)\times (n - size[y] - k + j)) \times w_{x\to y}\)。
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 2010;
int fi[N], di[N << 1], ne[N << 1], da[N << 1], si[N], l, k, n;
ll f[N][N];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline void add(int x, int y, int z)
{
di[++l] = y;
da[l] = z;
ne[l] = fi[x];
fi[x] = l;
}
inline ll maxn(ll x, ll y)
{
return x > y ? x : y;
}
inline int minn(int x, int y)
{
return x < y ? x : y;
}
void dfs(int x, int fa)
{
int i, j, v, y, o;
si[x] = 1;
f[x][0] = f[x][1] = 0;
for (i = fi[x]; i; i = ne[i])
if ((y = di[i]) ^ fa)
{
dfs(y, x);
si[x] += si[y];
}
for (v = fi[x]; v; v = ne[v])
if ((y = di[v]) ^ fa)
for (i = minn(k, si[x]); ~i; i--)
for (j = 0, o = minn(i, si[y]); j <= o; j++)
if (~f[x][i - j])
f[x][i] = maxn(f[x][i], f[x][i - j] + f[y][j] + (1LL * j * (k - j) + 1LL * (si[y] - j) * (n - si[y] - k + j)) * da[v]);
}
int main()
{
int i, x, y, z;
n = re();
k = re();
for (i = 1; i < n; i++)
{
x = re();
y = re();
z = re();
add(x, y, z);
add(y, x, z);
}
memset(f, -1, sizeof(f));
dfs(1, 0);
printf("%lld", f[1][k]);
return 0;
}
BZOJ4033或洛谷3177 [HAOI2015]树上染色的更多相关文章
- 洛谷 3177 [HAOI2015] 树上染色
题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- 洛谷 P3177 [HAOI2015]树上染色
题目链接 题目描述 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0~ N\) 之内的正整数 \(K\) ,你要在这棵树中选择 \(K\)个点,将其染成黑色,并将其他 的\(N-K\)个 ...
- 洛谷P3177 [HAOI2015]树上染色(树形dp)
题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...
- 洛谷P3177 [HAOI2015]树上染色(树上背包)
题意 题目链接 Sol 比较套路吧,设\(f[i][j]\)表示以\(i\)为根的子树中选了\(j\)个黑点对答案的贡献 然后考虑每条边的贡献,边的两边的答案都是可以算出来的 转移的时候背包一下. # ...
- 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...
- 洛谷P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- 洛谷P3178 [HAOI2015]树上操作(线段树)
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- 洛谷 P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
随机推荐
- Pandas分类
Pandas分类 categorical data是指分类数据:数据类型为:男女.班级(一班.二班).省份(河北.江苏等),若使用赋值法给变量赋值,例如(男=1,女=0),数字1,0之间没有大小之分, ...
- CSS 盒子大小
盒子的宽和高 盒子的大小通过宽和高来指定. 默认情况下,盒子的大小刚好容纳其中的内容. 两个属性设置盒子的宽和高 width 设置宽 height 设置高 示例: 1 2 3 4 5 6 7 8 9 ...
- ABAP 常用函数
函数名 描述 SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新组织VI ...
- echart生成饼状图
//绘制图表. echarts.init(document.getElementById('main')).setOption({ tooltip : { trigger: 'item', //触发类 ...
- qt 中的基本知识
1. 由 .ui 文件生成界面头文件: uic -o ui_dialog.h dialog.ui 2. 在工程目录下生成与平台无关的工程文件 : qmake -project 3. 生成与平台相关的 ...
- ok6410下的uboot分析与实现
uboot 由两阶段代码组成: •第一阶段主要步骤: 1.将cpu设置为svc模式 2.关闭mmu 3.设置外设端口地址 4.关闭watchdog 5.关闭中断 6.初始化时钟 7.初始化内存DRAM ...
- HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList 底层实现
HashMap相关问题 1.你用过HashMap吗?什么是HashMap?你为什么用到它? 用过,HashMap是基于哈希表的Map接口的非同步实现,它允许null键和null值,且HashMap依托 ...
- 1.5.4、CDH 搭建Hadoop在安装之前(定制安装解决方案---配置自定义Java主目录位置)
配置自定义Java主目录位置 注意: Cloudera强烈建议安装JDK/ usr / java / jdk-version,允许Cloudera Manager自动检测并使用正确的JDK版本.如果在 ...
- python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点
1,lambda: 匿名函数 2.sorgted() 排序函数 3,filter() 过滤函数 筛选 4,map() 映射函数 5.递归 6.二分法 一. 匿名函数: lambda lamb ...
- 第一次登录mysql,使用任何命令都报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
问题: 使用临时密码登录成功后,使用任何myql命令,例如show databases;都提示下面的报错 ERROR 1820 (HY000): You must reset your passwor ...