洛谷 P3177 [HAOI2015]树上染色
生活随笔
收集整理的這篇文章主要介紹了
洛谷 P3177 [HAOI2015]树上染色
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接
題目描述
有一棵點(diǎn)數(shù)為 \(N\) 的樹,樹邊有邊權(quán)。給你一個(gè)在 \(0~ N\) 之內(nèi)的正整數(shù) \(K\) ,你要在這棵樹中選擇 \(K\)個(gè)點(diǎn),將其染成黑色,并將其他 的\(N-K\)個(gè)點(diǎn)染成白色 。 將所有點(diǎn)染色后,你會(huì)獲得黑點(diǎn)兩兩之間的距離加上白點(diǎn)兩兩之間的距離的和的受益。問受益最大值是多少。
題解
有點(diǎn)難想的dp 我果然太菜了
%%%__stdcall
\(f[i][j]\) 為以\(i\)為根的子樹, 選了染了\(j\)個(gè)黑點(diǎn)的最大貢獻(xiàn)
然后就是樹形背包。。
siz[u]為以u(píng)為根的子樹大小
for (int j = Min(K, siz[u]); j >= 0; j--)for (int k = 0; k <= Min(j, siz[v]); k++)if (f[u][j-k] >= 0) {long long val = 1ll*k*(K-k)*g[i].w + 1ll*(siz[v]-k)*(n-K+k-siz[v])*g[i].w;f[u][j] = Max(f[u][j], f[u][j-k] + f[v][k] + val);}貢獻(xiàn)為子樹貢獻(xiàn)加上該邊的貢獻(xiàn)(子樹黑點(diǎn)個(gè)數(shù) * 其它黑點(diǎn)個(gè)數(shù) * 邊權(quán) + 子樹白點(diǎn)個(gè)數(shù) * 其它白點(diǎn)個(gè)數(shù) * 邊權(quán) )
Code
#include<bits/stdc++.h> #define LL long long #define RG register using namespace std;inline int gi() {int f = 1, s = 0;char c = getchar();while (c != '-' && (c < '0' || c > '9')) c = getchar();if (c == '-') f = -1, c = getchar();while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();return f == 1 ? s : -s; }const int N = 2010;struct node {int to, next, w; }g[N<<1]; int last[N], gl; inline void add(int z, int x, int y) {g[++gl] = (node) {y, last[x], z};last[x] = gl;g[++gl] = (node) {x, last[y], z};last[y] = gl;return ; }int siz[N], n, K; long long f[N][N];inline void init(int u, int fa) {siz[u] = 1;for (int i = last[u]; i; i = g[i].next) {int v = g[i].to;if (v == fa) continue;init(v, u);siz[u] += siz[v];}return ; } #define Min(x, y) ((x<y)?x:y) #define Max(x, y) ((x>y)?x:y) inline void dfs(int u, int fa) {memset(f[u], 128, sizeof(f[u]));f[u][0] = f[u][1] = 0;for (int i = last[u]; i; i = g[i].next) {int v = g[i].to;if (v == fa) continue;dfs(v, u);for (int j = Min(K, siz[u]); j >= 0; j--)for (int k = 0; k <= Min(j, siz[v]); k++)if (f[u][j-k] >= 0) {long long val = 1ll*k*(K-k)*g[i].w + 1ll*(siz[v]-k)*(n-K+k-siz[v])*g[i].w;f[u][j] = Max(f[u][j], f[u][j-k] + f[v][k] + val);} }return ; }int main() {n = gi(), K = gi();for (int i = 1; i < n; i++)add(gi(), gi(), gi());init(1, 0);dfs(1, 0);printf("%lld\n", f[1][K]);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/zzy2005/p/9873709.html
總結(jié)
以上是生活随笔為你收集整理的洛谷 P3177 [HAOI2015]树上染色的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css内容居中
- 下一篇: BZOJ 1305 dance跳舞(最大