ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树上染色

2022-05-28 21:00:28  阅读:174  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有