标签:include int 染色 ll dfs add 树上
树上染色
树上背包 + 边贡献
HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 2e3 + 10;
const ll INF = 1e18;
int n, k;
ll f[N][N];//f[u][x]为以u为根的子树中,将x个点染成黑色
ll tmp[N];
int sz[N];
struct Edge
{
int to;
ll val;
};
vector<vector<Edge> > G(N);
void add(int u, int v, int w)
{
G[u].push_back({v, w});
}
void dfs(int u, int fa)
{
sz[u] = 1;
for (auto [v, w] : G[u])
{
if (v == fa)
continue;
dfs(v, u);
for (int i = 0; i <= sz[u] + sz[v]; i++)
tmp[i] = -INF;
for (int i = 0; i <= sz[u]; i++)
{
for (int j = 0; j <= sz[v]; j++)
{
ll cnt = j * (k - j) + (sz[v] - j) * (n - sz[v] - k + j);
tmp[i+j] = max(tmp[i+j], f[u][i] + f[v][j] + w * cnt);
}
}
for (int i = 0; i <= sz[u] + sz[v]; i++)
f[u][i] = tmp[i];
sz[u] += sz[v];
}
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> k;
for (int i = 1; i < n; i++)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w), add(v, u, w);
}
dfs(1, -1);
cout << f[1][k] << endl;
return 0;
}
标签:include,int,染色,ll,dfs,add,树上 来源: https://www.cnblogs.com/hzy717zsy/p/16321915.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。